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/06/17 06:22:56 UTC

directory-kerby git commit: DIRKRB-580 Implement list_principals in Remote Kadmin. Contributed by Qing.

Repository: directory-kerby
Updated Branches:
  refs/heads/kadmin-remote 0d5a21926 -> 5775c4913


DIRKRB-580 Implement list_principals in Remote Kadmin. Contributed by Qing.


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

Branch: refs/heads/kadmin-remote
Commit: 5775c4913c5369e29878de8df53808012415d8c0
Parents: 0d5a219
Author: plusplusjiajia <ji...@intel.com>
Authored: Fri Jun 17 14:27:27 2016 +0800
Committer: plusplusjiajia <ji...@intel.com>
Committed: Fri Jun 17 14:27:27 2016 +0800

----------------------------------------------------------------------
 .../admin/server/kadmin/AdminServerHandler.java | 131 ++++++++++---------
 .../kerberos/kerb/admin/RemoteAdminTool.java    |  14 +-
 .../kerb/admin/kadmin/remote/AdminClient.java   |  13 ++
 .../kerb/admin/kadmin/remote/AdminHandler.java  |  35 +++++
 .../admin/kadmin/remote/RemoteKadminImpl.java   |  17 ++-
 .../remote/command/RemoteGetprincsCommand.java  |  65 +++++++++
 .../remote/command/RemotePrintUsageCommand.java |  42 ++++++
 .../kadmin/remote/impl/DefaultAdminHandler.java |  19 +++
 .../kadmin/remote/request/GetprincsRequest.java |  72 ++++++++++
 .../kerb/admin/tool/AdminMessageType.java       |   4 +-
 .../kerberos/kerb/admin/tool/GetprincsRep.java  |  26 ++++
 .../kerberos/kerb/admin/tool/GetprincsReq.java  |  26 ++++
 12 files changed, 394 insertions(+), 70 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/5775c491/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 1032644..de915f6 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
@@ -32,6 +32,7 @@ import org.slf4j.LoggerFactory;
 import java.io.IOException;
 import java.net.InetAddress;
 import java.nio.ByteBuffer;
+import java.util.List;
 
 /**
  * KDC handler to process client requests. Currently only one realm is supported.
@@ -82,6 +83,10 @@ public class AdminServerHandler {
                 System.out.println("message type: rename principal req");
                 responseMessage = handleRenamePrincipalReq(localKadmin, fieldInfos);
                 break;
+            case GET_PRINCS_REQ:
+                System.out.println("message type getPrincs req");
+                responseMessage = handleGetprincsReq(localKadmin, fieldInfos);
+                break;
             default:
                 throw new KrbException("AdminMessageType error, can not handle it.");
         }
@@ -103,14 +108,7 @@ public class AdminServerHandler {
                 String error = "principal already exist!";
                 LOG.error(error);
                 System.err.println(error);
-                XdrFieldInfo[] xdrFieldInfos = new XdrFieldInfo[3];
-                xdrFieldInfos[0] = new XdrFieldInfo(0, XdrDataType.ENUM, AdminMessageType.ADD_PRINCIPAL_REP);
-                xdrFieldInfos[1] = new XdrFieldInfo(1, XdrDataType.INTEGER, 1);
-                xdrFieldInfos[2] = new XdrFieldInfo(2, XdrDataType.STRING, error);
-                AdminMessageCode value = new AdminMessageCode(xdrFieldInfos);
-                AdminMessage errorMessage = new AddPrincipalRep();
-                errorMessage.setMessageBuffer(ByteBuffer.wrap(value.encode()));
-                ByteBuffer response = KadminCode.encodeMessage(errorMessage);
+                ByteBuffer response = infoPackageTool(error, "addPrincipal");
                 return response;
             }
         } else if (paramNum == 2 && fieldInfos[3].getDataType() == XdrDataType.STRING) {
@@ -122,35 +120,15 @@ public class AdminServerHandler {
                 localKadmin.addPrincipal(temp[0], password);
             } catch (KrbException e) {
                 String error = "principal already exist.\n"
-                    + "Choose update password instead of add principal";
+                        + "Choose update password instead of add principal";
                 LOG.error(error);
-                XdrFieldInfo[] xdrFieldInfos = new XdrFieldInfo[3];
-                xdrFieldInfos[0] = new XdrFieldInfo(0, XdrDataType.ENUM, AdminMessageType.ADD_PRINCIPAL_REP);
-                xdrFieldInfos[1] = new XdrFieldInfo(1, XdrDataType.INTEGER, 1);
-                xdrFieldInfos[2] = new XdrFieldInfo(2, XdrDataType.STRING, error);
-                AdminMessageCode value = new AdminMessageCode(xdrFieldInfos);
-                AdminMessage errorMessage = new AddPrincipalRep();
-                errorMessage.setMessageBuffer(ByteBuffer.wrap(value.encode()));
-                ByteBuffer response = KadminCode.encodeMessage(errorMessage);
+                ByteBuffer response = infoPackageTool(error, "addPrincipal");
                 return response;
             }
         }
-
         String message = "add principal of " + principal;
         LOG.info(message);
-        //content to reply remain to construct
-        AdminMessage addPrincipalRep = new AddPrincipalRep();
-        /** encode admin message:
-         *  encode type
-         *  encode message
-         */
-        XdrFieldInfo[] xdrFieldInfos = new XdrFieldInfo[3];
-        xdrFieldInfos[0] = new XdrFieldInfo(0, XdrDataType.ENUM, AdminMessageType.ADD_PRINCIPAL_REP);
-        xdrFieldInfos[1] = new XdrFieldInfo(1, XdrDataType.INTEGER, 1);
-        xdrFieldInfos[2] = new XdrFieldInfo(2, XdrDataType.STRING, message);
-        AdminMessageCode value = new AdminMessageCode(xdrFieldInfos);
-        addPrincipalRep.setMessageBuffer(ByteBuffer.wrap(value.encode()));
-        ByteBuffer responseMessage = KadminCode.encodeMessage(addPrincipalRep);
+        ByteBuffer responseMessage = infoPackageTool(message, "addPrincipal");
         return responseMessage;
     }
 
@@ -163,27 +141,12 @@ public class AdminServerHandler {
         } catch (KrbException e) {
             String error = "no such principal exist!";
             LOG.error(error);
-            XdrFieldInfo[] xdrFieldInfos = new XdrFieldInfo[3];
-            xdrFieldInfos[0] = new XdrFieldInfo(0, XdrDataType.ENUM, AdminMessageType.DELETE_PRINCIPAL_REP);
-            xdrFieldInfos[1] = new XdrFieldInfo(1, XdrDataType.INTEGER, 1);
-            xdrFieldInfos[2] = new XdrFieldInfo(2, XdrDataType.STRING, error);
-            AdminMessageCode value = new AdminMessageCode(xdrFieldInfos);
-            AdminMessage errorMessage = new DeletePrincipalRep();
-            errorMessage.setMessageBuffer(ByteBuffer.wrap(value.encode()));
-            ByteBuffer response = KadminCode.encodeMessage(errorMessage);
+            ByteBuffer response = infoPackageTool(error, "deletePrincipal");
             return response;
         }
-
         String message = "delete principal of " + principal;
         LOG.info(message);
-        AdminMessage deletePrincipalRep = new DeletePrincipalRep();
-        XdrFieldInfo[] xdrFieldInfos = new XdrFieldInfo[3];
-        xdrFieldInfos[0] = new XdrFieldInfo(0, XdrDataType.ENUM, AdminMessageType.DELETE_PRINCIPAL_REP);
-        xdrFieldInfos[1] = new XdrFieldInfo(1, XdrDataType.INTEGER, 1);
-        xdrFieldInfos[2] = new XdrFieldInfo(2, XdrDataType.STRING, message);
-        AdminMessageCode value = new AdminMessageCode(xdrFieldInfos);
-        deletePrincipalRep.setMessageBuffer(ByteBuffer.wrap(value.encode()));
-        ByteBuffer responseMessage = KadminCode.encodeMessage(deletePrincipalRep);
+        ByteBuffer responseMessage = infoPackageTool(message, "deletePrincipal");
         return responseMessage;
     }
 
@@ -192,33 +155,77 @@ public class AdminServerHandler {
 
         String[] oldPrincipalName = ((String) fieldInfos[2].getValue()).split("@");
         String[] newPrincipalName = ((String) fieldInfos[3].getValue()).split("@");
-
         try {
             localKadmin.renamePrincipal(oldPrincipalName[0], newPrincipalName[0]);
         } catch (KrbException e) {
             String error = "the old principal name does not exist, or the new principal name"
-                + " already exists, rename failed.";
+                    + " already exists, rename failed.";
             System.err.println(error);
-            XdrFieldInfo[] xdrFieldInfos = new XdrFieldInfo[3];
-            xdrFieldInfos[0] = new XdrFieldInfo(0, XdrDataType.ENUM, AdminMessageType.RENAME_PRINCIPAL_REP);
-            xdrFieldInfos[1] = new XdrFieldInfo(1, XdrDataType.INTEGER, 1);
-            xdrFieldInfos[2] = new XdrFieldInfo(2, XdrDataType.STRING, error);
-            AdminMessageCode value = new AdminMessageCode(xdrFieldInfos);
-            AdminMessage errorMessage = new RenamePrincipalRep();
-            errorMessage.setMessageBuffer(ByteBuffer.wrap(value.encode()));
-            ByteBuffer response = KadminCode.encodeMessage(errorMessage);
+            ByteBuffer response = infoPackageTool(error, "renamePrincipal");
             return response;
         }
 
         String message = "rename " + oldPrincipalName[0] + " to " + newPrincipalName[0];
-        AdminMessage renamePrincipalRep = new RenamePrincipalRep();
+        ByteBuffer responseMessage = infoPackageTool(message, "renamePrincipal");
+        return responseMessage;
+    }
+
+    private ByteBuffer handleGetprincsReq(LocalKadmin localKadmin, XdrFieldInfo[] fieldInfos) throws IOException {
+        String globString = ((String) fieldInfos[2].getValue());
+        List<String> princsList = null;
+
+        try {
+            if (globString == null || globString.isEmpty()) {
+                princsList = localKadmin.getPrincipals();
+            } else {
+                princsList = localKadmin.getPrincipals(globString);
+            }
+            ByteBuffer responseMessage = infoPackageTool(listToString(princsList), "getPrincs");
+            return responseMessage;
+        } catch (KrbException e) {
+            String error = "principal do not exist.";
+            ByteBuffer responseError = infoPackageTool(error, "getPrincs");
+            return responseError;
+        }
+    }
+
+    private ByteBuffer infoPackageTool(String message, String dealType) throws IOException {
+        AdminMessage adminMessage = null;
         XdrFieldInfo[] xdrFieldInfos = new XdrFieldInfo[3];
-        xdrFieldInfos[0] = new XdrFieldInfo(0, XdrDataType.ENUM, AdminMessageType.RENAME_PRINCIPAL_REP);
+
+        if ("getPrincs".equals(dealType)) {
+            adminMessage = new GetprincsRep();
+            xdrFieldInfos[0] = new XdrFieldInfo(0, XdrDataType.ENUM, AdminMessageType.GET_PRINCS_REP);
+        } else if ("renamePrincipal".equals(dealType)) {
+            adminMessage = new RenamePrincipalRep();
+            xdrFieldInfos[0] = new XdrFieldInfo(0, XdrDataType.ENUM, AdminMessageType.RENAME_PRINCIPAL_REP);
+        } else if ("deletePrincipal".equals(dealType)) {
+            adminMessage = new DeletePrincipalRep();
+            xdrFieldInfos[0] = new XdrFieldInfo(0, XdrDataType.ENUM, AdminMessageType.DELETE_PRINCIPAL_REP);
+        } else if ("addPrincipal".equals(dealType)) {
+            adminMessage = new AddPrincipalRep();
+            xdrFieldInfos[0] = new XdrFieldInfo(0, XdrDataType.ENUM, AdminMessageType.ADD_PRINCIPAL_REP);
+        }
+
         xdrFieldInfos[1] = new XdrFieldInfo(1, XdrDataType.INTEGER, 1);
         xdrFieldInfos[2] = new XdrFieldInfo(2, XdrDataType.STRING, message);
+
         AdminMessageCode value = new AdminMessageCode(xdrFieldInfos);
-        renamePrincipalRep.setMessageBuffer(ByteBuffer.wrap(value.encode()));
-        ByteBuffer responseMessage = KadminCode.encodeMessage(renamePrincipalRep);
+        adminMessage.setMessageBuffer(ByteBuffer.wrap(value.encode()));
+
+        ByteBuffer responseMessage = KadminCode.encodeMessage(adminMessage);
         return responseMessage;
     }
+
+    private String listToString(List<String> list) {
+        if (list.size() <= 0) {
+            return null;
+        }
+        //Both speed and safety,so use StringBuffer
+        StringBuffer result = new StringBuffer();
+        for (int i = 0; i < list.size(); i++) {
+            result.append(list.get(i)).append(" ");
+        }
+        return result.toString();
+    }
 }

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/5775c491/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/RemoteAdminTool.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/RemoteAdminTool.java b/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/RemoteAdminTool.java
index fbeda4a..7d26534 100644
--- a/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/RemoteAdminTool.java
+++ b/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/RemoteAdminTool.java
@@ -22,11 +22,13 @@ package org.apache.kerby.kerberos.kerb.admin;
 import org.apache.kerby.kerberos.kerb.KrbException;
 import org.apache.kerby.kerberos.kerb.admin.kadmin.remote.AdminClient;
 import org.apache.kerby.kerberos.kerb.admin.kadmin.remote.AdminConfig;
+import org.apache.kerby.util.OSUtil;
 import org.apache.kerby.kerberos.kerb.admin.kadmin.remote.command.RemoteAddPrincipalCommand;
 import org.apache.kerby.kerberos.kerb.admin.kadmin.remote.command.RemoteCommand;
 import org.apache.kerby.kerberos.kerb.admin.kadmin.remote.command.RemoteDeletePrincipalCommand;
 import org.apache.kerby.kerberos.kerb.admin.kadmin.remote.command.RemoteRenamePrincipalCommand;
-import org.apache.kerby.util.OSUtil;
+import org.apache.kerby.kerberos.kerb.admin.kadmin.remote.command.RemoteGetprincsCommand;
+import org.apache.kerby.kerberos.kerb.admin.kadmin.remote.command.RemotePrintUsageCommand;
 
 import java.io.File;
 import java.util.Scanner;
@@ -35,6 +37,7 @@ import java.util.Scanner;
  * Command use of remote admin
  */
 public class RemoteAdminTool {
+    private static final String PROMPT = RemoteAdminTool.class.getSimpleName() + ".local:";
     private static final String USAGE = (OSUtil.isWindows()
         ? "Usage: bin\\remoteAdmin.cmd" : "Usage: sh bin/remoteAdmin.sh")
         + " <conf-file>\n"
@@ -51,7 +54,9 @@ public class RemoteAdminTool {
         + "delete_principal, delprinc\n"
         + "                         Delete principal\n"
         + "rename_principal, renprinc\n"
-        + "                         Rename principal\n";
+        + "                         Rename principal\n"
+        + "listprincs\n"
+        + "          List principals\n";
 
     public static void main(String[] args) throws Exception {
         AdminClient adminClient;
@@ -87,6 +92,7 @@ public class RemoteAdminTool {
 
             while (!(input.equals("quit") || input.equals("exit") || input.equals("q"))) {
                 excute(adminClient, input);
+                System.out.print(PROMPT);
                 input = scanner.nextLine();
             }
         }
@@ -111,6 +117,10 @@ public class RemoteAdminTool {
         } else if (input.startsWith("rename_principal")
             || input.startsWith("renprinc")) {
             executor = new RemoteRenamePrincipalCommand(adminClient);
+        } else if (input.startsWith("list_principals")) {
+            executor = new RemoteGetprincsCommand(adminClient);
+        } else if (input.startsWith("listprincs")) {
+            executor = new RemotePrintUsageCommand();
         } else {
             System.out.println(LEGAL_COMMANDS);
             return;

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/5775c491/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 f482262..86faa65 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
@@ -26,6 +26,7 @@ import org.apache.kerby.kerberos.kerb.admin.kadmin.remote.impl.DefaultInternalAd
 import org.apache.kerby.kerberos.kerb.admin.kadmin.remote.impl.InternalAdminClient;
 
 import java.io.File;
+import java.util.List;
 
 /**
  * A Krb client API for applications to interact with KDC
@@ -184,4 +185,16 @@ public class AdminClient {
         Kadmin remote = new RemoteKadminImpl(innerClient);
         remote.renamePrincipal(oldPrincipal, newPrincipal);
     }
+
+    public List<String> requestGetprincs() throws KrbException {
+        Kadmin remote = new RemoteKadminImpl(innerClient);
+        List<String> principalLists = remote.getPrincipals();
+        return principalLists;
+    }
+
+    public List<String> requestGetprincsWithExp(String exp) throws KrbException {
+        Kadmin remote = new RemoteKadminImpl(innerClient);
+        List<String> principalLists = remote.getPrincipals(exp);
+        return principalLists;
+    }
 }

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/5775c491/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 0a64914..0db757c 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
@@ -30,6 +30,8 @@ import org.apache.kerby.xdr.type.XdrStructType;
 
 import java.io.IOException;
 import java.nio.ByteBuffer;
+import java.util.Arrays;
+import java.util.List;
 
 public abstract class AdminHandler {
 
@@ -115,6 +117,37 @@ public abstract class AdminHandler {
         }
     }
 
+    public List<String> onResponseMessageForList(AdminRequest adminRequest,
+                                  ByteBuffer responseMessage) throws KrbException {
+        List<String> princalsList = null;
+
+        XdrStructType decoded = new AdminMessageCode();
+        try {
+            decoded.decode(responseMessage);
+        } catch (IOException e) {
+            throw new KrbException("On response message failed.", e);
+        }
+        XdrFieldInfo[] fieldInfos = decoded.getValue().getXdrFieldInfos();
+        AdminMessageType type = (AdminMessageType) fieldInfos[0].getValue();
+
+        switch (type) {
+            case GET_PRINCS_REP:
+                if (adminRequest.getAdminReq().getAdminMessageType()
+                        == AdminMessageType.GET_PRINCS_REQ) {
+                    String[] temp = ((String) fieldInfos[2].getValue()).trim().split(" ");
+                    princalsList = Arrays.asList(temp);
+                } else {
+                    throw new KrbException("Response message type error: need "
+                            + AdminMessageType.GET_PRINCS_REP);
+                }
+                break;
+            default:
+                throw new KrbException("Response message type error: " + type);
+        }
+
+        return princalsList;
+    }
+
     /**
      * Send message to kdc.
      *
@@ -124,4 +157,6 @@ public abstract class AdminHandler {
      */
     protected abstract void sendMessage(AdminRequest adminRequest,
                                         ByteBuffer requestMessage) throws IOException;
+
+    protected abstract List<String> handleRequestForList(AdminRequest adminRequest) throws KrbException;
 }

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/5775c491/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 915287e..fc9af6b 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
@@ -24,13 +24,14 @@ 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.transport.KrbNetwork;
+import org.apache.kerby.kerberos.kerb.transport.KrbTransport;
+import org.apache.kerby.kerberos.kerb.transport.TransportPair;
 import org.apache.kerby.kerberos.kerb.admin.kadmin.remote.request.AddPrincipalRequest;
 import org.apache.kerby.kerberos.kerb.admin.kadmin.remote.request.AdminRequest;
 import org.apache.kerby.kerberos.kerb.admin.kadmin.remote.request.DeletePrincipalRequest;
 import org.apache.kerby.kerberos.kerb.admin.kadmin.remote.request.RenamePrincipalRequest;
-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 org.apache.kerby.kerberos.kerb.admin.kadmin.remote.request.GetprincsRequest;
 
 import java.io.File;
 import java.io.IOException;
@@ -174,12 +175,18 @@ public class RemoteKadminImpl implements Kadmin {
 
     @Override
     public List<String> getPrincipals() throws KrbException {
-        return null;
+        AdminRequest grtPrincsRequest = new GetprincsRequest();
+        grtPrincsRequest.setTransport(transport);
+        AdminHandler adminHandler = new DefaultAdminHandler();
+        return adminHandler.handleRequestForList(grtPrincsRequest);
     }
 
     @Override
     public List<String> getPrincipals(String globString) throws KrbException {
-        return null;
+        AdminRequest grtPrincsRequest = new GetprincsRequest(globString);
+        grtPrincsRequest.setTransport(transport);
+        AdminHandler adminHandler = new DefaultAdminHandler();
+        return adminHandler.handleRequestForList(grtPrincsRequest);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/5775c491/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/kadmin/remote/command/RemoteGetprincsCommand.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/kadmin/remote/command/RemoteGetprincsCommand.java b/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/kadmin/remote/command/RemoteGetprincsCommand.java
new file mode 100644
index 0000000..2e15281
--- /dev/null
+++ b/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/kadmin/remote/command/RemoteGetprincsCommand.java
@@ -0,0 +1,65 @@
+/**
+ *  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.command;
+
+import org.apache.kerby.kerberos.kerb.KrbException;
+import org.apache.kerby.kerberos.kerb.admin.kadmin.remote.AdminClient;
+import java.util.List;
+
+public class RemoteGetprincsCommand extends RemoteCommand {
+    private static final String USAGE = "Usage: list_principals [expression]\n"
+            + "\t'expression' is a shell-style glob expression that can contain the wild-card characters ?, *, and []."
+            + "\tExample:\n"
+            + "\t\tlist_principals [expression]\n";
+
+    public RemoteGetprincsCommand(AdminClient adminClient) {
+        super(adminClient);
+    }
+
+    @Override
+    public void execute(String input) throws KrbException {
+        String[] items = input.split("\\s+");
+        //String param = items[0];
+        if (items.length > 2) {
+            System.err.println(USAGE);
+            return;
+        }
+
+        List<String> principalLists = null;
+
+        if (items.length == 1) {
+            principalLists = adminClient.requestGetprincs();
+        } else {
+            //have expression
+            String exp = items[1];
+            principalLists = adminClient.requestGetprincsWithExp(exp);
+        }
+
+        if (principalLists.size() == 0 || principalLists.size() == 1 && principalLists.get(0).isEmpty()) {
+            return;
+        } else {
+            System.out.println("Principals are listed:");
+            for (int i = 0; i < principalLists.size(); i++) {
+                System.out.println(principalLists.get(i));
+            }
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/5775c491/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/kadmin/remote/command/RemotePrintUsageCommand.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/kadmin/remote/command/RemotePrintUsageCommand.java b/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/kadmin/remote/command/RemotePrintUsageCommand.java
new file mode 100644
index 0000000..a27e252
--- /dev/null
+++ b/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/kadmin/remote/command/RemotePrintUsageCommand.java
@@ -0,0 +1,42 @@
+/**
+ *  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.command;
+
+import org.apache.kerby.kerberos.kerb.KrbException;
+
+public class RemotePrintUsageCommand extends RemoteCommand {
+
+    private static final String LISTPRINCSUSAGE = "Usage: list_principals [expression]\n"
+            + "\t'expression' is a shell-style glob expression that can contain "
+            + "the wild-card characters ?, *, and [].\n"
+            + "\tExample:\n"
+            + "\t\tlist_principals [expression]\n";
+
+    public RemotePrintUsageCommand() {
+        super(null);
+    }
+
+    @Override
+    public void execute(String input) throws KrbException {
+        if (input.startsWith("listprincs")) {
+            System.out.println(LISTPRINCSUSAGE);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/5775c491/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 d0e1d07..3d05b50 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
@@ -26,6 +26,7 @@ import org.apache.kerby.kerberos.kerb.transport.KrbTransport;
 
 import java.io.IOException;
 import java.nio.ByteBuffer;
+import java.util.List;
 
 public class DefaultAdminHandler extends AdminHandler {
 
@@ -57,4 +58,22 @@ public class DefaultAdminHandler extends AdminHandler {
         KrbTransport transport = adminRequest.getTransport();
         transport.sendMessage(requestMessage);
     }
+
+    @Override
+    public List<String> handleRequestForList(AdminRequest adminRequest) throws KrbException {
+        /**send message*/
+        super.handleRequest(adminRequest);
+
+        KrbTransport transport = adminRequest.getTransport();
+        ByteBuffer receiveMessage = null;
+        List<String> prinicalList = null;
+        try {
+            receiveMessage = transport.receiveMessage();
+            prinicalList = super.onResponseMessageForList(adminRequest, receiveMessage);
+        } catch (IOException e) {
+            throw new KrbException("Admin receives response message failed", e);
+        }
+
+        return prinicalList;
+    }
 }

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/5775c491/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/kadmin/remote/request/GetprincsRequest.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/kadmin/remote/request/GetprincsRequest.java b/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/kadmin/remote/request/GetprincsRequest.java
new file mode 100644
index 0000000..e582b15
--- /dev/null
+++ b/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/kadmin/remote/request/GetprincsRequest.java
@@ -0,0 +1,72 @@
+/**
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ *
+ */
+package org.apache.kerby.kerberos.kerb.admin.kadmin.remote.request;
+
+import org.apache.kerby.kerberos.kerb.KrbException;
+import org.apache.kerby.kerberos.kerb.admin.tool.AdminMessageCode;
+import org.apache.kerby.kerberos.kerb.admin.tool.AdminMessageType;
+import org.apache.kerby.kerberos.kerb.admin.tool.GetprincsReq;
+import org.apache.kerby.xdr.XdrDataType;
+import org.apache.kerby.xdr.XdrFieldInfo;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+
+/**
+ * Created by root on 6/3/16.
+ */
+public class GetprincsRequest extends AdminRequest {
+    private String globString = null;
+
+    public GetprincsRequest() {
+        super(null);
+    }
+
+    public GetprincsRequest(String globString) {
+        super(null);
+        this.globString = globString;
+    }
+
+    @Override
+    public void process() throws KrbException {
+        //encoding and set adminReq
+
+        GetprincsReq getprincsReq = new GetprincsReq();
+
+        XdrFieldInfo[] xdrFieldInfos = new XdrFieldInfo[3];
+        xdrFieldInfos[0] = new XdrFieldInfo(0, XdrDataType.ENUM, AdminMessageType.GET_PRINCS_REQ);
+        xdrFieldInfos[1] = new XdrFieldInfo(1, XdrDataType.INTEGER, 2);
+        xdrFieldInfos[2] = new XdrFieldInfo(2, XdrDataType.STRING, globString);
+
+        AdminMessageCode value = new AdminMessageCode(xdrFieldInfos);
+        byte[] encodeBytes;
+        try {
+            encodeBytes = value.encode();
+        } catch (IOException e) {
+            throw new KrbException("Xdr encode error when generate get principals request.", e);
+        }
+        ByteBuffer messageBuffer = ByteBuffer.wrap(encodeBytes);
+        getprincsReq.setMessageBuffer(messageBuffer);
+
+        setAdminReq(getprincsReq);
+
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/5775c491/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
index 5630d13..66f4f1a 100644
--- 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
@@ -40,7 +40,9 @@ public enum AdminMessageType implements EnumType {
     DELETE_PRINCIPAL_REQ(2),
     DELETE_PRINCIPAL_REP(3),
     RENAME_PRINCIPAL_REQ(4),
-    RENAME_PRINCIPAL_REP(5);
+    RENAME_PRINCIPAL_REP(5),
+    GET_PRINCS_REQ(6),
+    GET_PRINCS_REP(7);
 
     private int value;
 

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/5775c491/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/tool/GetprincsRep.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/tool/GetprincsRep.java b/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/tool/GetprincsRep.java
new file mode 100644
index 0000000..e9d8d39
--- /dev/null
+++ b/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/tool/GetprincsRep.java
@@ -0,0 +1,26 @@
+/**
+ *  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;
+
+public class GetprincsRep extends AdminRep {
+    public GetprincsRep() {
+        super(AdminMessageType.GET_PRINCS_REP);
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/5775c491/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/tool/GetprincsReq.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/tool/GetprincsReq.java b/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/tool/GetprincsReq.java
new file mode 100644
index 0000000..b985f6a
--- /dev/null
+++ b/kerby-kerb/kerb-admin/src/main/java/org/apache/kerby/kerberos/kerb/admin/tool/GetprincsReq.java
@@ -0,0 +1,26 @@
+/**
+ *  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;
+
+public class GetprincsReq extends AdminReq {
+    public GetprincsReq() {
+        super(AdminMessageType.GET_PRINCS_REQ);
+    }
+}