You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by pl...@apache.org on 2016/03/11 08:58:54 UTC

directory-kerby git commit: DIRKRB-534 Implementing remote KAdmin and KPasswd(part1), contributed by Yan.

Repository: directory-kerby
Updated Branches:
  refs/heads/kadmin-remote 8188a1277 -> b1f7256c7


DIRKRB-534 Implementing remote KAdmin and KPasswd(part1), contributed by Yan.


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

Branch: refs/heads/kadmin-remote
Commit: b1f7256c79a708b074b8c09907aa042ccefd1feb
Parents: 8188a12
Author: plusplusjiajia <ji...@intel.com>
Authored: Fri Mar 11 16:03:32 2016 +0800
Committer: plusplusjiajia <ji...@intel.com>
Committed: Fri Mar 11 16:03:32 2016 +0800

----------------------------------------------------------------------
 .../admin/server/kadmin/AdminServerHandler.java | 90 +++++---------------
 .../kadmin/impl/DefaultAdminServerHandler.java  |  4 +-
 .../kerb/admin/admin/AdminServerTest.java       | 50 +++++++++++
 .../kerberos/kerb/admin/admin/KadminTest.java   | 24 ------
 .../kerberos/kerb/admin/kadmin/Kadmin.java      |  2 +-
 .../admin/kadmin/local/LocalKadminImpl.java     |  2 +
 .../kerb/admin/kadmin/remote/AdminClient.java   |  9 ++
 .../kerb/admin/kadmin/remote/AdminHandler.java  | 45 +++++-----
 .../admin/kadmin/remote/RemoteKadminImpl.java   | 39 +++++++++
 .../impl/AbstractInternalAdminClient.java       |  1 +
 .../kadmin/remote/impl/DefaultAdminHandler.java | 25 +++---
 .../remote/impl/DefaultInternalAdminClient.java | 16 +++-
 .../kadmin/remote/impl/InternalAdminClient.java |  2 +
 .../admin/kadmin/remote/request/AdRequest.java  | 48 +++++++++++
 .../kadmin/remote/request/AdminRequest.java     | 36 ++++++++
 .../kerby/kerberos/kerb/admin/tool/AdRep.java   | 31 +++++++
 .../kerby/kerberos/kerb/admin/tool/AdReq.java   | 31 +++++++
 .../kerberos/kerb/admin/tool/AdminMessage.java  | 49 +++++++++++
 .../kerb/admin/tool/AdminMessageType.java       | 62 ++++++++++++++
 .../kerberos/kerb/admin/tool/AdminRep.java      | 34 ++++++++
 .../kerberos/kerb/admin/tool/AdminReq.java      | 37 ++++++++
 .../kerberos/kerb/admin/tool/KadminCode.java    | 60 +++++++++++++
 .../kerberos/kerb/admin/admin/KadminTest.java   | 24 ------
 .../kerberos/kerb/admin/admin/adminTest.java    | 50 +++++++++++
 24 files changed, 613 insertions(+), 158 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/b1f7256c/kerby-kerb/kerb-admin-server/src/main/java/org/apache/kerby/kerberos/kerb/admin/server/kadmin/AdminServerHandler.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-admin-server/src/main/java/org/apache/kerby/kerberos/kerb/admin/server/kadmin/AdminServerHandler.java b/kerby-kerb/kerb-admin-server/src/main/java/org/apache/kerby/kerberos/kerb/admin/server/kadmin/AdminServerHandler.java
index 57bb9f0..3592b48 100644
--- a/kerby-kerb/kerb-admin-server/src/main/java/org/apache/kerby/kerberos/kerb/admin/server/kadmin/AdminServerHandler.java
+++ b/kerby-kerb/kerb-admin-server/src/main/java/org/apache/kerby/kerberos/kerb/admin/server/kadmin/AdminServerHandler.java
@@ -19,10 +19,16 @@
  */
 package org.apache.kerby.kerberos.kerb.admin.server.kadmin;
 
+import org.apache.kerby.kerberos.kerb.admin.kadmin.local.LocalKadmin;
+import org.apache.kerby.kerberos.kerb.admin.kadmin.local.LocalKadminImpl;
+import org.apache.kerby.kerberos.kerb.admin.tool.KadminCode;
 import org.apache.kerby.kerberos.kerb.KrbException;
+import org.apache.kerby.kerberos.kerb.admin.tool.AdRep;
+import org.apache.kerby.kerberos.kerb.admin.tool.AdminMessage;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.io.IOException;
 import java.net.InetAddress;
 import java.nio.ByteBuffer;
 
@@ -51,77 +57,25 @@ public class AdminServerHandler {
      * @return The response message
      */
     public ByteBuffer handleMessage(ByteBuffer receivedMessage,
-                                    InetAddress remoteAddress) throws KrbException {
-        return null;
-        /*
-        KrbMessage krbRequest;
-        KdcRequest kdcRequest = null;
-        KrbMessage krbResponse;
+                                    InetAddress remoteAddress) throws KrbException, IOException {
+        AdminMessage requestMessage = KadminCode.decodeMessage(receivedMessage);
+        System.out.println("receive message type: " + requestMessage.getAdminMessageType());
+        String receiveMsg = new String (requestMessage.getMessageBuffer().array());
+        System.out.println("server handleMessage: " + receiveMsg);
+        String[] principal = receiveMsg.split("@");
+        System.out.println("clientName: " + principal[0]);
+        System.out.println("realm: " + principal[1]);
 
-        ByteBuffer message = receivedMessage.duplicate();
+        /**Add principal to backend here*/
+        //LocalKadmin localKadmin = new LocalKadminImpl(adminServerContext.getAdminServerSetting().getAdminServerConfig(),
+         //       adminServerContext.getAdminServerSetting().getBackendConfig());
+        //localKadmin.addPrincipal(principal[0]);
 
-        try {
-            krbRequest = KrbCodec.decodeMessage(receivedMessage);
-        } catch (IOException e) {
-            LOG.error("Krb decoding message failed", e);
-            throw new KrbException(KrbErrorCode.KRB_AP_ERR_MSG_TYPE, "Krb decoding message failed");
-        }
-
-        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.getAdminRealm().equals(realm)) {
-                LOG.error("Invalid realm from kdc request: " + 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);
-            } else {
-                LOG.error("Invalid message type: " + messageType);
-                throw new KrbException(KrbErrorCode.KRB_AP_ERR_MSG_TYPE);
-            }
-        }
-
-        // For checksum
-        if (kdcRequest == null) {
-            throw new KrbException("Kdc request is null.");
-        }
-        kdcRequest.setReqPackage(message);
-        if (remoteAddress == null) {
-            throw new KrbException("Remote address is null, not available.");
-        }
-        kdcRequest.setClientAddress(remoteAddress);
-        kdcRequest.isTcp(isTcp);
-
-        try {
-            kdcRequest.process();
-            krbResponse = kdcRequest.getReply();
-        } catch (KrbException e) {
-            if (e instanceof KdcRecoverableException) {
-                krbResponse = handleRecoverableException(
-                        (KdcRecoverableException) e, kdcRequest);
-            } else {
-                throw e;
-            }
-        }
-
-        int bodyLen = krbResponse.encodingLength();
-        ByteBuffer responseMessage;
-        if (isTcp) {
-            responseMessage = ByteBuffer.allocate(bodyLen + 4);
-            responseMessage.putInt(bodyLen);
-        } else {
-            responseMessage = ByteBuffer.allocate(bodyLen);
-        }
-        KrbCodec.encode(krbResponse, responseMessage);
-        responseMessage.flip();
+        String message = "add principal of " + principal[0];
+        AdminMessage replyMeesage = new AdRep(ByteBuffer.wrap(message.getBytes()));
+        ByteBuffer responseMessage = KadminCode.encodeMessage(replyMeesage);
 
         return responseMessage;
-        */
+
     }
 }

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/b1f7256c/kerby-kerb/kerb-admin-server/src/main/java/org/apache/kerby/kerberos/kerb/admin/server/kadmin/impl/DefaultAdminServerHandler.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-admin-server/src/main/java/org/apache/kerby/kerberos/kerb/admin/server/kadmin/impl/DefaultAdminServerHandler.java b/kerby-kerb/kerb-admin-server/src/main/java/org/apache/kerby/kerberos/kerb/admin/server/kadmin/impl/DefaultAdminServerHandler.java
index 7f8db73..1e230ce 100644
--- a/kerby-kerb/kerb-admin-server/src/main/java/org/apache/kerby/kerberos/kerb/admin/server/kadmin/impl/DefaultAdminServerHandler.java
+++ b/kerby-kerb/kerb-admin-server/src/main/java/org/apache/kerby/kerberos/kerb/admin/server/kadmin/impl/DefaultAdminServerHandler.java
@@ -64,8 +64,8 @@ public class DefaultAdminServerHandler extends AdminServerHandler implements Run
         boolean isTcp = transport instanceof KrbTcpTransport;
 
         try {
-            ByteBuffer krbResponse = handleMessage(message, clientAddress);
-            transport.sendMessage(krbResponse);
+            ByteBuffer adminResponse = handleMessage(message, clientAddress);
+            transport.sendMessage(adminResponse);
         } catch (Exception e) {
             transport.release();
             logger.error("Error occured while processing request:", e);

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/b1f7256c/kerby-kerb/kerb-admin-server/src/test/java/org/apache/kerby/kerberos/kerb/admin/admin/AdminServerTest.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-admin-server/src/test/java/org/apache/kerby/kerberos/kerb/admin/admin/AdminServerTest.java b/kerby-kerb/kerb-admin-server/src/test/java/org/apache/kerby/kerberos/kerb/admin/admin/AdminServerTest.java
new file mode 100644
index 0000000..dea13f6
--- /dev/null
+++ b/kerby-kerb/kerb-admin-server/src/test/java/org/apache/kerby/kerberos/kerb/admin/admin/AdminServerTest.java
@@ -0,0 +1,50 @@
+/**
+ *  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.admin.admin;
+
+
+import org.apache.kerby.kerberos.kerb.KrbException;
+import org.apache.kerby.kerberos.kerb.admin.server.kadmin.AdminServer;
+import org.apache.kerby.util.NetworkUtil;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.IOException;
+import java.net.InetSocketAddress;
+import java.net.SocketAddress;
+import java.nio.ByteBuffer;
+import java.nio.channels.SocketChannel;
+
+public class AdminServerTest {
+    public static void main(String[] args) throws KrbException {
+        String serverHost = "localhost";
+        AdminServer adminServer;
+
+        adminServer = new AdminServer();
+        adminServer.setAdminHost(serverHost);
+        adminServer.setAllowUdp(false);
+        adminServer.setAllowTcp(true);
+        adminServer.setAdminTcpPort(65417);
+        adminServer.init();
+        adminServer.start();
+        System.out.println("Server started!");
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/b1f7256c/kerby-kerb/kerb-admin-server/src/test/java/org/apache/kerby/kerberos/kerb/admin/admin/KadminTest.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-admin-server/src/test/java/org/apache/kerby/kerberos/kerb/admin/admin/KadminTest.java b/kerby-kerb/kerb-admin-server/src/test/java/org/apache/kerby/kerberos/kerb/admin/admin/KadminTest.java
deleted file mode 100644
index fcdaee7..0000000
--- a/kerby-kerb/kerb-admin-server/src/test/java/org/apache/kerby/kerberos/kerb/admin/admin/KadminTest.java
+++ /dev/null
@@ -1,24 +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.admin.admin;
-
-public class KadminTest {
-
-}

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/b1f7256c/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/kadmin/Kadmin.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/kadmin/Kadmin.java b/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/kadmin/Kadmin.java
index 8f95b37..84d0c76 100644
--- a/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/kadmin/Kadmin.java
+++ b/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/kadmin/Kadmin.java
@@ -48,7 +48,7 @@ public interface Kadmin {
     /**
      * Add principal to backend.
      *
-     * @param principal The principal to be added into backend
+     * @par am principal The principal to be added into backend
      * @param kOptions The KOptions with principal info
      * @throws KrbException e
      */

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/b1f7256c/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/kadmin/local/LocalKadminImpl.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/kadmin/local/LocalKadminImpl.java b/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/kadmin/local/LocalKadminImpl.java
index 48d0031..1e870f3 100644
--- a/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/kadmin/local/LocalKadminImpl.java
+++ b/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/kadmin/local/LocalKadminImpl.java
@@ -65,6 +65,8 @@ public class LocalKadminImpl implements LocalKadmin {
         this.kdcSetting = new KdcSetting(kdcConfig, backendConfig);
     }
 
+    //
+
     /**
      * Construct with prepared conf dir.
      *

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/b1f7256c/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/kadmin/remote/AdminClient.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/kadmin/remote/AdminClient.java b/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/kadmin/remote/AdminClient.java
index d4cf515..78788b8 100644
--- a/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/kadmin/remote/AdminClient.java
+++ b/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/kadmin/remote/AdminClient.java
@@ -21,8 +21,12 @@ package org.apache.kerby.kerberos.kerb.admin.kadmin.remote;
 
 import org.apache.kerby.KOptions;
 import org.apache.kerby.kerberos.kerb.KrbException;
+import org.apache.kerby.kerberos.kerb.admin.kadmin.Kadmin;
+import org.apache.kerby.kerberos.kerb.admin.kadmin.remote.impl.DefaultAdminHandler;
 import org.apache.kerby.kerberos.kerb.admin.kadmin.remote.impl.InternalAdminClient;
 import org.apache.kerby.kerberos.kerb.admin.kadmin.remote.impl.DefaultInternalAdminClient;
+import org.apache.kerby.kerberos.kerb.admin.kadmin.remote.request.AdRequest;
+import org.apache.kerby.kerberos.kerb.admin.kadmin.remote.request.AdminRequest;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -166,4 +170,9 @@ public class AdminClient {
     public AdminConfig getAdminConfig() {
         return adminConfig;
     }
+
+    public void requestAddPrincial(String principal) throws KrbException {
+        Kadmin remote = new RemoteKadminImpl(innerClient);
+        remote.addPrincipal(principal);
+    }
 }

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/b1f7256c/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/kadmin/remote/AdminHandler.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/kadmin/remote/AdminHandler.java b/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/kadmin/remote/AdminHandler.java
index 38ebe13..faa81e2 100644
--- a/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/kadmin/remote/AdminHandler.java
+++ b/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/kadmin/remote/AdminHandler.java
@@ -19,8 +19,12 @@
  */
 package org.apache.kerby.kerberos.kerb.admin.kadmin.remote;
 
+import org.apache.kerby.kerberos.kerb.admin.tool.KadminCode;
 import org.apache.kerby.kerberos.kerb.KrbException;
 import org.apache.kerby.kerberos.kerb.admin.kadmin.remote.request.AdminRequest;
+import org.apache.kerby.kerberos.kerb.admin.tool.AdminReq;
+import org.apache.kerby.kerberos.kerb.admin.tool.AdminMessage;
+import org.apache.kerby.kerberos.kerb.admin.tool.AdminMessageType;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -43,26 +47,25 @@ public abstract class AdminHandler {
     /**
      * Handle the kdc request.
      *
-     * @param adminRequest The kdc request
+     * @param adminRequest The admin request
      * @throws KrbException e
      */
     public void handleRequest(AdminRequest adminRequest) throws KrbException {
         adminRequest.process();
-        /*
-        ByteBuffer requestMessage;
-
-        requestMessage = ByteBuffer.allocate(bodyLen + 4);
-        requestMessage.putInt(bodyLen);
+        AdminReq adminReq = adminRequest.getAdminReq();
+        ByteBuffer requestMessage = KadminCode.encodeMessage(adminReq);
+        requestMessage.flip();
 
         try {
             sendMessage(adminRequest, requestMessage);
         } catch (IOException e) {
-            throw new KrbException("sending message failed", e);
-        }*/
+            throw new KrbException("Admin sends request message failed", e);
+        }
+
     }
 
     /**
-     * Process the response messabe from kdc.
+     * Process the response message from kdc.
      *
      * @param adminRequest The admin request
      * @param responseMessage The message from kdc
@@ -70,28 +73,26 @@ public abstract class AdminHandler {
      */
     public void onResponseMessage(AdminRequest adminRequest,
                                   ByteBuffer responseMessage) throws KrbException {
-        /*
-        KrbMessage kdcRep = null;
+        AdminMessage replyMessage = null;
         try {
-            kdcRep = KrbCodec.decodeMessage(responseMessage);
+            replyMessage = KadminCode.decodeMessage(responseMessage);
         } catch (IOException e) {
-            throw new KrbException("Krb decoding message failed", e);
+            throw new KrbException("Kadmin 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);
+        AdminMessageType messageType = replyMessage.getAdminMessageType();
+        if (messageType == AdminMessageType.AD_REP &&
+                adminRequest.getAdminReq().getAdminMessageType() == AdminMessageType.AD_REQ) {
+            String receiveMsg = new String(replyMessage.getMessageBuffer().array());
+            System.out.println("Admin receive message success: " + receiveMsg);
+        } else {
+            throw new RuntimeException("Receive wrong reply");
         }
-        */
     }
 
     /**
      * Send message to kdc.
      *
-     * @param adminRequest The kdc request
+     * @param adminRequest The admin request
      * @param requestMessage The request message to kdc
      * @throws IOException e
      */

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/b1f7256c/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/kadmin/remote/RemoteKadminImpl.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/kadmin/remote/RemoteKadminImpl.java b/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/kadmin/remote/RemoteKadminImpl.java
index 4245e0d..efccc34 100644
--- a/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/kadmin/remote/RemoteKadminImpl.java
+++ b/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/kadmin/remote/RemoteKadminImpl.java
@@ -22,8 +22,16 @@ package org.apache.kerby.kerberos.kerb.admin.kadmin.remote;
 import org.apache.kerby.KOptions;
 import org.apache.kerby.kerberos.kerb.KrbException;
 import org.apache.kerby.kerberos.kerb.admin.kadmin.Kadmin;
+import org.apache.kerby.kerberos.kerb.admin.kadmin.remote.impl.DefaultAdminHandler;
+import org.apache.kerby.kerberos.kerb.admin.kadmin.remote.impl.InternalAdminClient;
+import org.apache.kerby.kerberos.kerb.admin.kadmin.remote.request.AdRequest;
+import org.apache.kerby.kerberos.kerb.admin.kadmin.remote.request.AdminRequest;
+import org.apache.kerby.kerberos.kerb.transport.KrbNetwork;
+import org.apache.kerby.kerberos.kerb.transport.KrbTransport;
+import org.apache.kerby.kerberos.kerb.transport.TransportPair;
 
 import java.io.File;
+import java.io.IOException;
 import java.util.List;
 
 /**
@@ -37,6 +45,31 @@ import java.util.List;
  */
 public class RemoteKadminImpl implements Kadmin {
 
+    private InternalAdminClient innerClient;
+    private KrbTransport transport;
+
+    public RemoteKadminImpl(InternalAdminClient innerClient) throws KrbException {
+        this.innerClient = innerClient;
+        TransportPair tpair = null;
+        try {
+            tpair = AdminUtil.getTransportPair(innerClient.getSetting());
+        } catch (KrbException e) {
+            e.printStackTrace();
+        }
+        KrbNetwork network = new KrbNetwork();
+        network.setSocketTimeout(innerClient.getSetting().getTimeout());
+        try {
+            transport = network.connect(tpair);
+        } catch (IOException e) {
+            throw new KrbException("Failed to create transport", e);
+        }
+    }
+
+    public InternalAdminClient getInnerClient() {
+        return innerClient;
+    }
+
+
     @Override
     public String getKadminPrincipal() {
         return null;
@@ -44,6 +77,12 @@ public class RemoteKadminImpl implements Kadmin {
 
     @Override
     public void addPrincipal(String principal) throws KrbException {
+        //generate an admin request
+        AdminRequest adRequest = new AdRequest(principal);
+        adRequest.setTransport(transport);
+        //handle it
+        AdminHandler adminHandler = new DefaultAdminHandler();
+        adminHandler.handleRequest(adRequest);
 
     }
 

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/b1f7256c/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/kadmin/remote/impl/AbstractInternalAdminClient.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/kadmin/remote/impl/AbstractInternalAdminClient.java b/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/kadmin/remote/impl/AbstractInternalAdminClient.java
index 1f1635f..0123488 100644
--- a/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/kadmin/remote/impl/AbstractInternalAdminClient.java
+++ b/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/kadmin/remote/impl/AbstractInternalAdminClient.java
@@ -22,6 +22,7 @@ package org.apache.kerby.kerberos.kerb.admin.kadmin.remote.impl;
 import org.apache.kerby.kerberos.kerb.KrbException;
 import org.apache.kerby.kerberos.kerb.admin.kadmin.remote.AdminContext;
 import org.apache.kerby.kerberos.kerb.admin.kadmin.remote.AdminSetting;
+import org.apache.kerby.kerberos.kerb.admin.kadmin.remote.request.AdminRequest;
 
 /**
  * A krb client API for applications to interact with KDC

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/b1f7256c/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/kadmin/remote/impl/DefaultAdminHandler.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/kadmin/remote/impl/DefaultAdminHandler.java b/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/kadmin/remote/impl/DefaultAdminHandler.java
index deaa722..eed8b55 100644
--- a/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/kadmin/remote/impl/DefaultAdminHandler.java
+++ b/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/kadmin/remote/impl/DefaultAdminHandler.java
@@ -22,6 +22,7 @@ package org.apache.kerby.kerberos.kerb.admin.kadmin.remote.impl;
 import org.apache.kerby.kerberos.kerb.KrbException;
 import org.apache.kerby.kerberos.kerb.admin.kadmin.remote.AdminHandler;
 import org.apache.kerby.kerberos.kerb.admin.kadmin.remote.request.AdminRequest;
+import org.apache.kerby.kerberos.kerb.transport.KrbTransport;
 
 import java.io.IOException;
 import java.nio.ByteBuffer;
@@ -32,31 +33,27 @@ public class DefaultAdminHandler extends AdminHandler {
      * {@inheritDoc}
      */
     @Override
-    public void handleRequest(AdminRequest kdcRequest) throws KrbException {
-        /*
-        KrbTransport transport = (KrbTransport) kdcRequest.getSessionData();
-        transport.setAttachment(kdcRequest);
+    public void handleRequest(AdminRequest adminRequest) throws KrbException {
+        //
+        super.handleRequest(adminRequest);
 
-        super.handleRequest(kdcRequest);
-        ByteBuffer receivedMessage = null;
+        KrbTransport transport = adminRequest.getTransport();
+        ByteBuffer receiveMessage = null;
         try {
-            receivedMessage = transport.receiveMessage();
+            receiveMessage = transport.receiveMessage();
         } catch (IOException e) {
-            throw new KrbException("Receiving response message failed", e);
+            throw new KrbException("Admin receives response message failed", e);
         }
-        super.onResponseMessage(kdcRequest, receivedMessage);
-        */
+        super.onResponseMessage(adminRequest, receiveMessage);
     }
 
     /**
      * {@inheritDoc}
      */
     @Override
-    protected void sendMessage(AdminRequest kdcRequest,
+    protected void sendMessage(AdminRequest adminRequest,
                                ByteBuffer requestMessage) throws IOException {
-        /*
-        KrbTransport transport = (KrbTransport) kdcRequest.getSessionData();
+        KrbTransport transport = adminRequest.getTransport();
         transport.sendMessage(requestMessage);
-        */
     }
 }

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/b1f7256c/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/kadmin/remote/impl/DefaultInternalAdminClient.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/kadmin/remote/impl/DefaultInternalAdminClient.java b/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/kadmin/remote/impl/DefaultInternalAdminClient.java
index 97e1db4..109570f 100644
--- a/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/kadmin/remote/impl/DefaultInternalAdminClient.java
+++ b/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/kadmin/remote/impl/DefaultInternalAdminClient.java
@@ -20,8 +20,10 @@
 package org.apache.kerby.kerberos.kerb.admin.kadmin.remote.impl;
 
 import org.apache.kerby.kerberos.kerb.KrbException;
+import org.apache.kerby.kerberos.kerb.admin.kadmin.remote.AdminHandler;
 import org.apache.kerby.kerberos.kerb.admin.kadmin.remote.AdminSetting;
 import org.apache.kerby.kerberos.kerb.admin.kadmin.remote.AdminUtil;
+import org.apache.kerby.kerberos.kerb.admin.kadmin.remote.request.AdminRequest;
 import org.apache.kerby.kerberos.kerb.transport.KrbNetwork;
 import org.apache.kerby.kerberos.kerb.transport.KrbTransport;
 import org.apache.kerby.kerberos.kerb.transport.TransportPair;
@@ -33,13 +35,21 @@ import java.io.IOException;
  */
 public class DefaultInternalAdminClient extends AbstractInternalAdminClient {
 
-    private DefaultAdminHandler krbHandler;
+    private DefaultAdminHandler adminHandler;
     private KrbTransport transport;
 
     public DefaultInternalAdminClient(AdminSetting krbSetting) {
         super(krbSetting);
     }
 
+    public AdminHandler getAdminHanlder() {
+        return adminHandler;
+    }
+
+    public KrbTransport getTransport() {
+        return transport;
+    }
+
     /**
      * {@inheritDoc}
      */
@@ -47,8 +57,8 @@ public class DefaultInternalAdminClient extends AbstractInternalAdminClient {
     public void init() throws KrbException {
         super.init();
 
-        this.krbHandler = new DefaultAdminHandler();
-        krbHandler.init(getContext());
+        this.adminHandler = new DefaultAdminHandler();
+        adminHandler.init(getContext());
 
         TransportPair tpair = AdminUtil.getTransportPair(getSetting());
         KrbNetwork network = new KrbNetwork();

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/b1f7256c/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/kadmin/remote/impl/InternalAdminClient.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/kadmin/remote/impl/InternalAdminClient.java b/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/kadmin/remote/impl/InternalAdminClient.java
index 47bfd3d..b862703 100644
--- a/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/kadmin/remote/impl/InternalAdminClient.java
+++ b/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/kadmin/remote/impl/InternalAdminClient.java
@@ -21,6 +21,8 @@ package org.apache.kerby.kerberos.kerb.admin.kadmin.remote.impl;
 
 import org.apache.kerby.kerberos.kerb.KrbException;
 import org.apache.kerby.kerberos.kerb.admin.kadmin.remote.AdminSetting;
+import org.apache.kerby.kerberos.kerb.admin.kadmin.remote.request.AdminRequest;
+import org.apache.kerby.kerberos.kerb.transport.KrbTransport;
 
 /**
  * An internal krb client interface.

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/b1f7256c/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/kadmin/remote/request/AdRequest.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/kadmin/remote/request/AdRequest.java b/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/kadmin/remote/request/AdRequest.java
new file mode 100644
index 0000000..c7ba7f7
--- /dev/null
+++ b/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/kadmin/remote/request/AdRequest.java
@@ -0,0 +1,48 @@
+/**
+ *  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.admin.kadmin.remote.request;
+
+import org.apache.kerby.kerberos.kerb.admin.kadmin.remote.AdminContext;
+import org.apache.kerby.kerberos.kerb.admin.tool.AdReq;
+
+import java.nio.ByteBuffer;
+
+/**
+ * AddPrincipal request
+ */
+public class AdRequest extends AdminRequest {
+
+    public AdRequest(AdminContext context) {
+        super(context);
+    }
+
+    public AdRequest(String principal) {
+        super(principal);
+    }
+
+    @Override
+    public void process() {
+        super.process();
+        AdReq adReq = new AdReq(ByteBuffer.wrap(super.getPrincipal().getBytes()));
+        setAdminReq(adReq);
+
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/b1f7256c/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/kadmin/remote/request/AdminRequest.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/kadmin/remote/request/AdminRequest.java b/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/kadmin/remote/request/AdminRequest.java
index 54968b2..bac47f0 100644
--- a/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/kadmin/remote/request/AdminRequest.java
+++ b/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/kadmin/remote/request/AdminRequest.java
@@ -20,14 +20,24 @@
 package org.apache.kerby.kerberos.kerb.admin.kadmin.remote.request;
 
 import org.apache.kerby.kerberos.kerb.admin.kadmin.remote.AdminContext;
+import org.apache.kerby.kerberos.kerb.transport.KrbTransport;
+import org.apache.kerby.kerberos.kerb.admin.tool.AdminReq;
 
 public class AdminRequest {
+    private String principal;
+    private KrbTransport transport;
+    private AdminReq adminReq;
+
     private AdminContext context;
 
     public AdminRequest(AdminContext context) {
         this.context = context;
     }
 
+    public AdminRequest(String principal) {
+        this.principal = principal;
+    }
+
     public AdminContext getContext() {
         return context;
     }
@@ -36,7 +46,33 @@ public class AdminRequest {
         this.context = context;
     }
 
+    public String getPrincipal() {
+        return principal;
+    }
+
+    public void setPrincipal(String principal) {
+        this.principal = principal;
+    }
+
+    public void setAdminReq(AdminReq adminReq) {
+        this.adminReq = adminReq;
+    }
+
+    public AdminReq getAdminReq() {
+        return adminReq;
+    }
+
     public void process() {
+        //
+
+    }
+
+
+    public void setTransport(KrbTransport transport) {
+        this.transport = transport;
+    }
 
+    public KrbTransport getTransport() {
+        return transport;
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/b1f7256c/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/tool/AdRep.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/tool/AdRep.java b/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/tool/AdRep.java
new file mode 100644
index 0000000..0cd6d60
--- /dev/null
+++ b/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/tool/AdRep.java
@@ -0,0 +1,31 @@
+/**
+ *  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.admin.tool;
+
+import java.nio.ByteBuffer;
+
+/**
+ * Add principal reply, to general admin message
+ */
+public class AdRep extends AdminRep {
+    public AdRep(ByteBuffer messageBuffer) {
+        super(AdminMessageType.AD_REP, messageBuffer);
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/b1f7256c/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/tool/AdReq.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/tool/AdReq.java b/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/tool/AdReq.java
new file mode 100644
index 0000000..37a2d7e
--- /dev/null
+++ b/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/tool/AdReq.java
@@ -0,0 +1,31 @@
+/**
+ *  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.admin.tool;
+
+import java.nio.ByteBuffer;
+
+/**
+ * Add principal request, to general admin message
+ */
+public class AdReq extends AdminReq {
+    public AdReq(ByteBuffer messageBuffer) {
+        super(AdminMessageType.AD_REQ, messageBuffer);
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/b1f7256c/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/tool/AdminMessage.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/tool/AdminMessage.java b/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/tool/AdminMessage.java
new file mode 100644
index 0000000..5efe961
--- /dev/null
+++ b/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/tool/AdminMessage.java
@@ -0,0 +1,49 @@
+/**
+ *  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.admin.tool;
+
+import java.nio.ByteBuffer;
+
+/**
+ * Deal with messages sent and received between Kadmin and Kadmin Server.
+ */
+public class AdminMessage {
+    private AdminMessageType adminMessageType;
+    private ByteBuffer messageBuffer;
+
+    public AdminMessage(AdminMessageType adminMessageType, ByteBuffer messageBuffer) {
+        this.adminMessageType = adminMessageType;
+        this.messageBuffer = messageBuffer;
+    }
+
+    public AdminMessageType getAdminMessageType() {
+        return adminMessageType;
+    }
+
+    public ByteBuffer getMessageBuffer() {
+        return messageBuffer;
+    }
+
+    public int encodingLength() {
+        return messageBuffer.limit() + 4; // 4 is the length of type
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/b1f7256c/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/tool/AdminMessageType.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/tool/AdminMessageType.java b/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/tool/AdminMessageType.java
new file mode 100644
index 0000000..2cd487b
--- /dev/null
+++ b/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/tool/AdminMessageType.java
@@ -0,0 +1,62 @@
+/**
+ *  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.admin.tool;
+
+import org.apache.kerby.asn1.EnumType;
+
+/**
+ * Type of Admin Message:
+ * NONE(-1)
+ * AD_REQ(0) add principal request
+ * AD_REP(1) add principal reply
+ */
+
+public enum AdminMessageType implements EnumType {
+    NONE(-1),
+    AD_REQ(0),
+    AD_REP(1);
+
+    private int value;
+
+    AdminMessageType(int value) {
+        this.value = value;
+    }
+
+    @Override
+    public int getValue() {
+        return value;
+    }
+
+    @Override
+    public String getName() {
+        return name();
+    }
+
+    public static AdminMessageType findType(int value) {
+        if (value >= 0) {
+            for (EnumType e : values()) {
+                if (e.getValue() == value) {
+                    return (AdminMessageType) e;
+                }
+            }
+        }
+        return NONE;
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/b1f7256c/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/tool/AdminRep.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/tool/AdminRep.java b/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/tool/AdminRep.java
new file mode 100644
index 0000000..a4a8735
--- /dev/null
+++ b/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/tool/AdminRep.java
@@ -0,0 +1,34 @@
+/**
+ *  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.admin.tool;
+
+import java.nio.ByteBuffer;
+
+/**
+ * Use to construct Admin message.
+ * Probably two kinds of reply.
+ * add principal -- AdRep
+ * change password? -- chRep
+ */
+public class AdminRep extends AdminMessage {
+    public AdminRep(AdminMessageType messageType, ByteBuffer messageBuffer) {
+        super(messageType, messageBuffer);
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/b1f7256c/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/tool/AdminReq.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/tool/AdminReq.java b/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/tool/AdminReq.java
new file mode 100644
index 0000000..297567d
--- /dev/null
+++ b/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/tool/AdminReq.java
@@ -0,0 +1,37 @@
+/**
+ *  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.admin.tool;
+
+import java.nio.ByteBuffer;
+
+
+/**
+ * Use to construct Admin message.
+ * Probably two kinds of request.
+ * add principal -- AdReq
+ * change password? -- chReq
+ */
+public class AdminReq extends AdminMessage {
+    public AdminReq(AdminMessageType messageType, ByteBuffer messageBuffer) {
+        super(messageType, messageBuffer);
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/b1f7256c/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/tool/KadminCode.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/tool/KadminCode.java b/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/tool/KadminCode.java
new file mode 100644
index 0000000..e99ec88
--- /dev/null
+++ b/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/tool/KadminCode.java
@@ -0,0 +1,60 @@
+/**
+ *  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.admin.tool;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+
+/**
+ * Used to decode messages between admin and admin server.
+ */
+public class KadminCode {
+    public static ByteBuffer encodeMessage(AdminMessage adminMessage) {
+        int length = adminMessage.encodingLength();
+        ByteBuffer buffer = ByteBuffer.allocate(length + 4); // 4 is the head to go through network
+        buffer.putInt(length); // head in network
+        buffer.putInt(adminMessage.getAdminMessageType().getValue()); // type
+        buffer.put(adminMessage.getMessageBuffer());
+        buffer.flip();
+        return buffer;
+    }
+
+
+    public static AdminMessage decodeMessage(ByteBuffer buffer) throws IOException {
+        //go through network, the total length has been removed.
+        int type = buffer.getInt();
+        System.out.println("type: " + type);
+        AdminMessageType adminMessageType = AdminMessageType.findType(type);
+        AdminMessage adminMessage = null;
+        byte[] bytes = new byte[buffer.remaining()];
+        buffer.get(bytes);
+        if (adminMessageType == AdminMessageType.AD_REQ) {
+            adminMessage = new AdReq(ByteBuffer.wrap(bytes));
+            System.out.println("check if decoding right: " + new String(ByteBuffer.wrap(bytes).array()));
+        } else if (adminMessageType == AdminMessageType.AD_REP) {
+            adminMessage = new AdRep(ByteBuffer.wrap(bytes));
+            System.out.println("check if decoding right2: " + new String(ByteBuffer.wrap(bytes).array()));
+        } else {
+            throw new IOException("Unknown Admin Message Type: " + type);
+        }
+
+        return adminMessage;
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/b1f7256c/kerby-kerb/kerb-admin/src/test/java/org/apache/kerby/kerberos/kerb/admin/admin/KadminTest.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-admin/src/test/java/org/apache/kerby/kerberos/kerb/admin/admin/KadminTest.java b/kerby-kerb/kerb-admin/src/test/java/org/apache/kerby/kerberos/kerb/admin/admin/KadminTest.java
deleted file mode 100644
index fcdaee7..0000000
--- a/kerby-kerb/kerb-admin/src/test/java/org/apache/kerby/kerberos/kerb/admin/admin/KadminTest.java
+++ /dev/null
@@ -1,24 +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.admin.admin;
-
-public class KadminTest {
-
-}

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/b1f7256c/kerby-kerb/kerb-admin/src/test/java/org/apache/kerby/kerberos/kerb/admin/admin/adminTest.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-admin/src/test/java/org/apache/kerby/kerberos/kerb/admin/admin/adminTest.java b/kerby-kerb/kerb-admin/src/test/java/org/apache/kerby/kerberos/kerb/admin/admin/adminTest.java
new file mode 100644
index 0000000..6a5f2f3
--- /dev/null
+++ b/kerby-kerb/kerb-admin/src/test/java/org/apache/kerby/kerberos/kerb/admin/admin/adminTest.java
@@ -0,0 +1,50 @@
+/**
+ *  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.admin.admin;
+
+import org.apache.kerby.kerberos.kerb.KrbException;
+import org.apache.kerby.kerberos.kerb.admin.kadmin.remote.AdminClient;
+import org.apache.kerby.util.NetworkUtil;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.net.InetSocketAddress;
+import java.nio.channels.ServerSocketChannel;
+import java.nio.channels.SocketChannel;
+
+public class AdminTest {
+    private final String KDC_REALM = "TEST.COM";
+    private final String clientPrincipalName = "alice";
+    private final String clientPrincipal =
+            clientPrincipalName + "@" + KDC_REALM;
+    private AdminClient adminClient;
+
+    @Test
+    public void testAdminClient() throws KrbException {
+        adminClient = new AdminClient();
+        adminClient.setAdminRealm(KDC_REALM);
+        adminClient.setAllowTcp(true);
+        adminClient.setAllowUdp(false);
+        adminClient.setAdminTcpPort(65417);
+        adminClient.init();
+        adminClient.requestAddPrincial(clientPrincipal);
+    }
+}