You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by dr...@apache.org on 2015/01/12 14:06:22 UTC

[14/50] [abbrv] directory-kerberos git commit: Renaming packages in haox-kerb projects, using "apache"

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/967d7e1c/haox-kerb/kerb-identity/src/main/java/org/apache/kerberos/kerb/identity/Identity.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-identity/src/main/java/org/apache/kerberos/kerb/identity/Identity.java b/haox-kerb/kerb-identity/src/main/java/org/apache/kerberos/kerb/identity/Identity.java
new file mode 100644
index 0000000..cce9c16
--- /dev/null
+++ b/haox-kerb/kerb-identity/src/main/java/org/apache/kerberos/kerb/identity/Identity.java
@@ -0,0 +1,48 @@
+package org.apache.kerberos.kerb.identity;
+
+import java.util.*;
+
+public class Identity {
+    private String name;
+    private Map<String, Attribute> attributes;
+
+    public Identity(String name) {
+        this.name = name;
+        this.attributes = new HashMap<String, Attribute>();
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public void addAttribute(String name, String value) {
+        attributes.put(name, new SimpleAttribute(name, value));
+    }
+
+    public void addAttribute(Attribute attribute) {
+        attributes.put(attribute.getName(), attribute);
+    }
+
+    public Set<String> getAttributes() {
+        return Collections.unmodifiableSet(attributes.keySet());
+    }
+
+    public String getSimpleAttribute(String name) {
+        Attribute attr = attributes.get(name);
+        if (! (attr instanceof SimpleAttribute)) {
+            throw new RuntimeException("Not simple attribute");
+        }
+        return ((SimpleAttribute) attr).getValue();
+    }
+
+    public void setAttributes(List<Attribute> attributes) {
+        this.attributes.clear();
+        for (Attribute attr : attributes) {
+            addAttribute(attr);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/967d7e1c/haox-kerb/kerb-identity/src/main/java/org/apache/kerberos/kerb/identity/IdentityService.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-identity/src/main/java/org/apache/kerberos/kerb/identity/IdentityService.java b/haox-kerb/kerb-identity/src/main/java/org/apache/kerberos/kerb/identity/IdentityService.java
new file mode 100644
index 0000000..9201f2e
--- /dev/null
+++ b/haox-kerb/kerb-identity/src/main/java/org/apache/kerberos/kerb/identity/IdentityService.java
@@ -0,0 +1,12 @@
+package org.apache.kerberos.kerb.identity;
+
+import java.util.List;
+
+public interface IdentityService {
+    public List<KrbIdentity> getIdentities();
+    public boolean checkIdentity(String name);
+    public KrbIdentity getIdentity(String name);
+    public void addIdentity(KrbIdentity identity);
+    public void updateIdentity(KrbIdentity identity);
+    public void deleteIdentity(KrbIdentity identity);
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/967d7e1c/haox-kerb/kerb-identity/src/main/java/org/apache/kerberos/kerb/identity/KrbAttributes.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-identity/src/main/java/org/apache/kerberos/kerb/identity/KrbAttributes.java b/haox-kerb/kerb-identity/src/main/java/org/apache/kerberos/kerb/identity/KrbAttributes.java
new file mode 100644
index 0000000..0939cf2
--- /dev/null
+++ b/haox-kerb/kerb-identity/src/main/java/org/apache/kerberos/kerb/identity/KrbAttributes.java
@@ -0,0 +1,6 @@
+package org.apache.kerberos.kerb.identity;
+
+public class KrbAttributes {
+    public static final String PRINCIPAL = "principal";
+    public static final String PASSWORD = "password";
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/967d7e1c/haox-kerb/kerb-identity/src/main/java/org/apache/kerberos/kerb/identity/KrbIdentity.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-identity/src/main/java/org/apache/kerberos/kerb/identity/KrbIdentity.java b/haox-kerb/kerb-identity/src/main/java/org/apache/kerberos/kerb/identity/KrbIdentity.java
new file mode 100644
index 0000000..a672b01
--- /dev/null
+++ b/haox-kerb/kerb-identity/src/main/java/org/apache/kerberos/kerb/identity/KrbIdentity.java
@@ -0,0 +1,107 @@
+package org.apache.kerberos.kerb.identity;
+
+import org.apache.kerberos.kerb.spec.KerberosTime;
+import org.apache.kerberos.kerb.spec.common.EncryptionKey;
+import org.apache.kerberos.kerb.spec.common.EncryptionType;
+import org.apache.kerberos.kerb.spec.common.PrincipalName;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class KrbIdentity {
+    private String principalName;
+    private PrincipalName principal;
+    private int keyVersion = 1;
+    private int kdcFlags = 0;
+    private boolean disabled = false;
+    private boolean locked = false;
+    private KerberosTime expireTime = KerberosTime.NEVER;
+    private KerberosTime createdTime = KerberosTime.now();
+
+    private Map<EncryptionType, EncryptionKey> keys =
+            new HashMap<EncryptionType, EncryptionKey>();
+
+    public KrbIdentity(String principalName) {
+        this.principalName = principalName;
+        this.principal = new PrincipalName(principalName);
+    }
+
+    public String getPrincipalName() {
+        return principalName;
+    }
+
+    public void setPrincipal(PrincipalName principal) {
+        this.principal = principal;
+    }
+
+    public PrincipalName getPrincipal() {
+        return principal;
+    }
+
+    public void setKeyVersion(int keyVersion) {
+        this.keyVersion = keyVersion;
+    }
+
+    public void setKdcFlags(int kdcFlags) {
+        this.kdcFlags = kdcFlags;
+    }
+
+    public void setDisabled(boolean disabled) {
+        this.disabled = disabled;
+    }
+
+    public void setLocked(boolean locked) {
+        this.locked = locked;
+    }
+
+    public void setExpireTime(KerberosTime expireTime) {
+        this.expireTime = expireTime;
+    }
+
+    public KerberosTime getExpireTime() {
+        return expireTime;
+    }
+
+    public KerberosTime getCreatedTime() {
+        return createdTime;
+    }
+
+    public void setCreatedTime(KerberosTime createdTime) {
+        this.createdTime = createdTime;
+    }
+
+    public boolean isDisabled() {
+        return disabled;
+    }
+
+    public boolean isLocked() {
+        return locked;
+    }
+
+    public void addKey(EncryptionKey encKey) {
+        keys.put(encKey.getKeyType(), encKey);
+    }
+
+    public void addKeys(List<EncryptionKey> encKeys) {
+        for (EncryptionKey key : encKeys) {
+            keys.put(key.getKeyType(), key);
+        }
+    }
+
+    public Map<EncryptionType, EncryptionKey> getKeys() {
+        return keys;
+    }
+
+    public EncryptionKey getKey(EncryptionType encType) {
+        return keys.get(encType);
+    }
+
+    public int getKdcFlags() {
+        return kdcFlags;
+    }
+
+    public int getKeyVersion() {
+        return keyVersion;
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/967d7e1c/haox-kerb/kerb-identity/src/main/java/org/apache/kerberos/kerb/identity/SimpleAttribute.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-identity/src/main/java/org/apache/kerberos/kerb/identity/SimpleAttribute.java b/haox-kerb/kerb-identity/src/main/java/org/apache/kerberos/kerb/identity/SimpleAttribute.java
new file mode 100644
index 0000000..5774dfa
--- /dev/null
+++ b/haox-kerb/kerb-identity/src/main/java/org/apache/kerberos/kerb/identity/SimpleAttribute.java
@@ -0,0 +1,18 @@
+package org.apache.kerberos.kerb.identity;
+
+public class SimpleAttribute extends Attribute {
+    private String value;
+
+    public SimpleAttribute(String name, String value) {
+        super(name);
+        this.value = value;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/967d7e1c/haox-kerb/kerb-identity/src/main/java/org/apache/kerberos/kerb/identity/backend/AbstractIdentityBackend.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-identity/src/main/java/org/apache/kerberos/kerb/identity/backend/AbstractIdentityBackend.java b/haox-kerb/kerb-identity/src/main/java/org/apache/kerberos/kerb/identity/backend/AbstractIdentityBackend.java
new file mode 100644
index 0000000..7adac7c
--- /dev/null
+++ b/haox-kerb/kerb-identity/src/main/java/org/apache/kerberos/kerb/identity/backend/AbstractIdentityBackend.java
@@ -0,0 +1,7 @@
+package org.apache.kerberos.kerb.identity.backend;
+
+import org.apache.kerberos.kerb.identity.IdentityService;
+
+public abstract class AbstractIdentityBackend implements IdentityService {
+
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/967d7e1c/haox-kerb/kerb-identity/src/main/java/org/apache/kerberos/kerb/identity/backend/InMemoryIdentityBackend.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-identity/src/main/java/org/apache/kerberos/kerb/identity/backend/InMemoryIdentityBackend.java b/haox-kerb/kerb-identity/src/main/java/org/apache/kerberos/kerb/identity/backend/InMemoryIdentityBackend.java
new file mode 100644
index 0000000..5a63f7e
--- /dev/null
+++ b/haox-kerb/kerb-identity/src/main/java/org/apache/kerberos/kerb/identity/backend/InMemoryIdentityBackend.java
@@ -0,0 +1,57 @@
+package org.apache.kerberos.kerb.identity.backend;
+
+import org.apache.kerberos.kerb.identity.KrbIdentity;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class InMemoryIdentityBackend extends AbstractIdentityBackend {
+
+    private Map<String, KrbIdentity> identities;
+
+    public InMemoryIdentityBackend() {
+        this.identities = new HashMap<String, KrbIdentity>();
+    }
+
+    public InMemoryIdentityBackend(Map<String, KrbIdentity> identities) {
+        this();
+        this.identities.putAll(identities);
+    }
+
+    @Override
+    public List<KrbIdentity> getIdentities() {
+        List<KrbIdentity> results = new ArrayList<KrbIdentity>(identities.size());
+        results.addAll(identities.values());
+        return results;
+    }
+
+    @Override
+    public boolean checkIdentity(String name) {
+        return identities.containsKey(name);
+    }
+
+    @Override
+    public KrbIdentity getIdentity(String name) {
+        if (identities.containsKey(name)) {
+            return identities.get(name);
+        }
+        return null;
+    }
+
+    @Override
+    public void addIdentity(KrbIdentity identity) {
+        identities.put(identity.getPrincipalName(), identity);
+    }
+
+    @Override
+    public void updateIdentity(KrbIdentity identity) {
+        identities.put(identity.getPrincipalName(), identity);
+    }
+
+    @Override
+    public void deleteIdentity(KrbIdentity identity) {
+        identities.remove(identity.getPrincipalName());
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/967d7e1c/haox-kerb/kerb-identity/src/main/java/org/apache/kerberos/kerb/identity/backend/SimpleIdentityBackend.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-identity/src/main/java/org/apache/kerberos/kerb/identity/backend/SimpleIdentityBackend.java b/haox-kerb/kerb-identity/src/main/java/org/apache/kerberos/kerb/identity/backend/SimpleIdentityBackend.java
new file mode 100644
index 0000000..a74e453
--- /dev/null
+++ b/haox-kerb/kerb-identity/src/main/java/org/apache/kerberos/kerb/identity/backend/SimpleIdentityBackend.java
@@ -0,0 +1,27 @@
+package org.apache.kerberos.kerb.identity.backend;
+
+import java.io.File;
+
+public class SimpleIdentityBackend extends InMemoryIdentityBackend {
+
+    private File identityFile;
+
+    public SimpleIdentityBackend(File identityFile) {
+        super();
+        this.identityFile = identityFile;
+    }
+
+    /**
+     * Load identities from file
+     */
+    public void load() {
+        // todo
+    }
+
+    /**
+     * Persist the updated identities back
+     */
+    public void save() {
+        // todo
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/967d7e1c/haox-kerb/kerb-identity/src/main/java/org/haox/kerb/identity/Attribute.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-identity/src/main/java/org/haox/kerb/identity/Attribute.java b/haox-kerb/kerb-identity/src/main/java/org/haox/kerb/identity/Attribute.java
deleted file mode 100644
index cadd67c..0000000
--- a/haox-kerb/kerb-identity/src/main/java/org/haox/kerb/identity/Attribute.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package org.haox.kerb.identity;
-
-public abstract class Attribute {
-    private String name;
-
-    public Attribute(String name) {
-        this.name = name;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/967d7e1c/haox-kerb/kerb-identity/src/main/java/org/haox/kerb/identity/ComplexAttribute.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-identity/src/main/java/org/haox/kerb/identity/ComplexAttribute.java b/haox-kerb/kerb-identity/src/main/java/org/haox/kerb/identity/ComplexAttribute.java
deleted file mode 100644
index 6b05de8..0000000
--- a/haox-kerb/kerb-identity/src/main/java/org/haox/kerb/identity/ComplexAttribute.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package org.haox.kerb.identity;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-public class ComplexAttribute extends Attribute {
-    private List<String> values;
-
-    public ComplexAttribute(String name) {
-        super(name);
-        this.values = new ArrayList<String>(1);
-    }
-
-    public List<String> getValues() {
-        return Collections.unmodifiableList(values);
-    }
-
-    public void setValues(List<String> values) {
-        this.values.clear();
-        this.values.addAll(values);
-    }
-}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/967d7e1c/haox-kerb/kerb-identity/src/main/java/org/haox/kerb/identity/Identity.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-identity/src/main/java/org/haox/kerb/identity/Identity.java b/haox-kerb/kerb-identity/src/main/java/org/haox/kerb/identity/Identity.java
deleted file mode 100644
index 8de32b9..0000000
--- a/haox-kerb/kerb-identity/src/main/java/org/haox/kerb/identity/Identity.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package org.haox.kerb.identity;
-
-import java.util.*;
-
-public class Identity {
-    private String name;
-    private Map<String, Attribute> attributes;
-
-    public Identity(String name) {
-        this.name = name;
-        this.attributes = new HashMap<String, Attribute>();
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public void addAttribute(String name, String value) {
-        attributes.put(name, new SimpleAttribute(name, value));
-    }
-
-    public void addAttribute(Attribute attribute) {
-        attributes.put(attribute.getName(), attribute);
-    }
-
-    public Set<String> getAttributes() {
-        return Collections.unmodifiableSet(attributes.keySet());
-    }
-
-    public String getSimpleAttribute(String name) {
-        Attribute attr = attributes.get(name);
-        if (! (attr instanceof SimpleAttribute)) {
-            throw new RuntimeException("Not simple attribute");
-        }
-        return ((SimpleAttribute) attr).getValue();
-    }
-
-    public void setAttributes(List<Attribute> attributes) {
-        this.attributes.clear();
-        for (Attribute attr : attributes) {
-            addAttribute(attr);
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/967d7e1c/haox-kerb/kerb-identity/src/main/java/org/haox/kerb/identity/IdentityService.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-identity/src/main/java/org/haox/kerb/identity/IdentityService.java b/haox-kerb/kerb-identity/src/main/java/org/haox/kerb/identity/IdentityService.java
deleted file mode 100644
index 506f40a..0000000
--- a/haox-kerb/kerb-identity/src/main/java/org/haox/kerb/identity/IdentityService.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package org.haox.kerb.identity;
-
-import java.util.List;
-
-public interface IdentityService {
-    public List<KrbIdentity> getIdentities();
-    public boolean checkIdentity(String name);
-    public KrbIdentity getIdentity(String name);
-    public void addIdentity(KrbIdentity identity);
-    public void updateIdentity(KrbIdentity identity);
-    public void deleteIdentity(KrbIdentity identity);
-}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/967d7e1c/haox-kerb/kerb-identity/src/main/java/org/haox/kerb/identity/KrbAttributes.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-identity/src/main/java/org/haox/kerb/identity/KrbAttributes.java b/haox-kerb/kerb-identity/src/main/java/org/haox/kerb/identity/KrbAttributes.java
deleted file mode 100644
index 2246815..0000000
--- a/haox-kerb/kerb-identity/src/main/java/org/haox/kerb/identity/KrbAttributes.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package org.haox.kerb.identity;
-
-public class KrbAttributes {
-    public static final String PRINCIPAL = "principal";
-    public static final String PASSWORD = "password";
-}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/967d7e1c/haox-kerb/kerb-identity/src/main/java/org/haox/kerb/identity/KrbIdentity.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-identity/src/main/java/org/haox/kerb/identity/KrbIdentity.java b/haox-kerb/kerb-identity/src/main/java/org/haox/kerb/identity/KrbIdentity.java
deleted file mode 100644
index b97ec03..0000000
--- a/haox-kerb/kerb-identity/src/main/java/org/haox/kerb/identity/KrbIdentity.java
+++ /dev/null
@@ -1,107 +0,0 @@
-package org.haox.kerb.identity;
-
-import org.haox.kerb.spec.KerberosTime;
-import org.haox.kerb.spec.common.EncryptionKey;
-import org.haox.kerb.spec.common.EncryptionType;
-import org.haox.kerb.spec.common.PrincipalName;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-public class KrbIdentity {
-    private String principalName;
-    private PrincipalName principal;
-    private int keyVersion = 1;
-    private int kdcFlags = 0;
-    private boolean disabled = false;
-    private boolean locked = false;
-    private KerberosTime expireTime = KerberosTime.NEVER;
-    private KerberosTime createdTime = KerberosTime.now();
-
-    private Map<EncryptionType, EncryptionKey> keys =
-            new HashMap<EncryptionType, EncryptionKey>();
-
-    public KrbIdentity(String principalName) {
-        this.principalName = principalName;
-        this.principal = new PrincipalName(principalName);
-    }
-
-    public String getPrincipalName() {
-        return principalName;
-    }
-
-    public void setPrincipal(PrincipalName principal) {
-        this.principal = principal;
-    }
-
-    public PrincipalName getPrincipal() {
-        return principal;
-    }
-
-    public void setKeyVersion(int keyVersion) {
-        this.keyVersion = keyVersion;
-    }
-
-    public void setKdcFlags(int kdcFlags) {
-        this.kdcFlags = kdcFlags;
-    }
-
-    public void setDisabled(boolean disabled) {
-        this.disabled = disabled;
-    }
-
-    public void setLocked(boolean locked) {
-        this.locked = locked;
-    }
-
-    public void setExpireTime(KerberosTime expireTime) {
-        this.expireTime = expireTime;
-    }
-
-    public KerberosTime getExpireTime() {
-        return expireTime;
-    }
-
-    public KerberosTime getCreatedTime() {
-        return createdTime;
-    }
-
-    public void setCreatedTime(KerberosTime createdTime) {
-        this.createdTime = createdTime;
-    }
-
-    public boolean isDisabled() {
-        return disabled;
-    }
-
-    public boolean isLocked() {
-        return locked;
-    }
-
-    public void addKey(EncryptionKey encKey) {
-        keys.put(encKey.getKeyType(), encKey);
-    }
-
-    public void addKeys(List<EncryptionKey> encKeys) {
-        for (EncryptionKey key : encKeys) {
-            keys.put(key.getKeyType(), key);
-        }
-    }
-
-    public Map<EncryptionType, EncryptionKey> getKeys() {
-        return keys;
-    }
-
-    public EncryptionKey getKey(EncryptionType encType) {
-        return keys.get(encType);
-    }
-
-    public int getKdcFlags() {
-        return kdcFlags;
-    }
-
-    public int getKeyVersion() {
-        return keyVersion;
-    }
-}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/967d7e1c/haox-kerb/kerb-identity/src/main/java/org/haox/kerb/identity/SimpleAttribute.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-identity/src/main/java/org/haox/kerb/identity/SimpleAttribute.java b/haox-kerb/kerb-identity/src/main/java/org/haox/kerb/identity/SimpleAttribute.java
deleted file mode 100644
index 8a56cba..0000000
--- a/haox-kerb/kerb-identity/src/main/java/org/haox/kerb/identity/SimpleAttribute.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package org.haox.kerb.identity;
-
-public class SimpleAttribute extends Attribute {
-    private String value;
-
-    public SimpleAttribute(String name, String value) {
-        super(name);
-        this.value = value;
-    }
-
-    public String getValue() {
-        return value;
-    }
-
-    public void setValue(String value) {
-        this.value = value;
-    }
-}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/967d7e1c/haox-kerb/kerb-identity/src/main/java/org/haox/kerb/identity/backend/AbstractIdentityBackend.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-identity/src/main/java/org/haox/kerb/identity/backend/AbstractIdentityBackend.java b/haox-kerb/kerb-identity/src/main/java/org/haox/kerb/identity/backend/AbstractIdentityBackend.java
deleted file mode 100644
index 9d95e3f..0000000
--- a/haox-kerb/kerb-identity/src/main/java/org/haox/kerb/identity/backend/AbstractIdentityBackend.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package org.haox.kerb.identity.backend;
-
-import org.haox.kerb.identity.IdentityService;
-
-public abstract class AbstractIdentityBackend implements IdentityService {
-
-}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/967d7e1c/haox-kerb/kerb-identity/src/main/java/org/haox/kerb/identity/backend/InMemoryIdentityBackend.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-identity/src/main/java/org/haox/kerb/identity/backend/InMemoryIdentityBackend.java b/haox-kerb/kerb-identity/src/main/java/org/haox/kerb/identity/backend/InMemoryIdentityBackend.java
deleted file mode 100644
index ac1eb69..0000000
--- a/haox-kerb/kerb-identity/src/main/java/org/haox/kerb/identity/backend/InMemoryIdentityBackend.java
+++ /dev/null
@@ -1,57 +0,0 @@
-package org.haox.kerb.identity.backend;
-
-import org.haox.kerb.identity.KrbIdentity;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-public class InMemoryIdentityBackend extends AbstractIdentityBackend {
-
-    private Map<String, KrbIdentity> identities;
-
-    public InMemoryIdentityBackend() {
-        this.identities = new HashMap<String, KrbIdentity>();
-    }
-
-    public InMemoryIdentityBackend(Map<String, KrbIdentity> identities) {
-        this();
-        this.identities.putAll(identities);
-    }
-
-    @Override
-    public List<KrbIdentity> getIdentities() {
-        List<KrbIdentity> results = new ArrayList<KrbIdentity>(identities.size());
-        results.addAll(identities.values());
-        return results;
-    }
-
-    @Override
-    public boolean checkIdentity(String name) {
-        return identities.containsKey(name);
-    }
-
-    @Override
-    public KrbIdentity getIdentity(String name) {
-        if (identities.containsKey(name)) {
-            return identities.get(name);
-        }
-        return null;
-    }
-
-    @Override
-    public void addIdentity(KrbIdentity identity) {
-        identities.put(identity.getPrincipalName(), identity);
-    }
-
-    @Override
-    public void updateIdentity(KrbIdentity identity) {
-        identities.put(identity.getPrincipalName(), identity);
-    }
-
-    @Override
-    public void deleteIdentity(KrbIdentity identity) {
-        identities.remove(identity.getPrincipalName());
-    }
-}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/967d7e1c/haox-kerb/kerb-identity/src/main/java/org/haox/kerb/identity/backend/SimpleIdentityBackend.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-identity/src/main/java/org/haox/kerb/identity/backend/SimpleIdentityBackend.java b/haox-kerb/kerb-identity/src/main/java/org/haox/kerb/identity/backend/SimpleIdentityBackend.java
deleted file mode 100644
index 7690830..0000000
--- a/haox-kerb/kerb-identity/src/main/java/org/haox/kerb/identity/backend/SimpleIdentityBackend.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package org.haox.kerb.identity.backend;
-
-import java.io.File;
-
-public class SimpleIdentityBackend extends InMemoryIdentityBackend {
-
-    private File identityFile;
-
-    public SimpleIdentityBackend(File identityFile) {
-        super();
-        this.identityFile = identityFile;
-    }
-
-    /**
-     * Load identities from file
-     */
-    public void load() {
-        // todo
-    }
-
-    /**
-     * Persist the updated identities back
-     */
-    public void save() {
-        // todo
-    }
-}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/967d7e1c/haox-kerb/kerb-identity/src/test/resources/kdc-krb5.conf
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-identity/src/test/resources/kdc-krb5.conf b/haox-kerb/kerb-identity/src/test/resources/kdc-krb5.conf
deleted file mode 100644
index d118dd1..0000000
--- a/haox-kerb/kerb-identity/src/test/resources/kdc-krb5.conf
+++ /dev/null
@@ -1,25 +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.
-#
-[libdefaults]
-    default_realm = {0}
-    udp_preference_limit = 1
-
-[realms]
-    {0} = '{'
-        kdc = {1}:{2}
-    '}'
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/967d7e1c/haox-kerb/kerb-identity/src/test/resources/kdc.ldiff
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-identity/src/test/resources/kdc.ldiff b/haox-kerb/kerb-identity/src/test/resources/kdc.ldiff
deleted file mode 100644
index e344131..0000000
--- a/haox-kerb/kerb-identity/src/test/resources/kdc.ldiff
+++ /dev/null
@@ -1,30 +0,0 @@
-dn: ou=users,dc=${0},dc=${1}
-objectClass: organizationalUnit
-objectClass: top
-ou: users
-
-dn: uid=krbtgt,ou=users,dc=${0},dc=${1}
-objectClass: top
-objectClass: person
-objectClass: inetOrgPerson
-objectClass: krb5principal
-objectClass: krb5kdcentry
-cn: KDC Service
-sn: Service
-uid: krbtgt
-userPassword: secret
-krb5PrincipalName: krbtgt/${2}.${3}@${2}.${3}
-krb5KeyVersionNumber: 0
-
-dn: uid=ldap,ou=users,dc=${0},dc=${1}
-objectClass: top
-objectClass: person
-objectClass: inetOrgPerson
-objectClass: krb5principal
-objectClass: krb5kdcentry
-cn: LDAP
-sn: Service
-uid: ldap
-userPassword: secret
-krb5PrincipalName: ldap/${4}@${2}.${3}
-krb5KeyVersionNumber: 0
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/967d7e1c/haox-kerb/kerb-kdc-test/src/main/java/org/apache/kerberos/kerb/server/TestKdcServer.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-kdc-test/src/main/java/org/apache/kerberos/kerb/server/TestKdcServer.java b/haox-kerb/kerb-kdc-test/src/main/java/org/apache/kerberos/kerb/server/TestKdcServer.java
new file mode 100644
index 0000000..fd1435f
--- /dev/null
+++ b/haox-kerb/kerb-kdc-test/src/main/java/org/apache/kerberos/kerb/server/TestKdcServer.java
@@ -0,0 +1,103 @@
+package org.apache.kerberos.kerb.server;
+
+import org.apache.kerberos.kerb.common.EncryptionUtil;
+import org.apache.kerberos.kerb.identity.KrbIdentity;
+import org.apache.kerberos.kerb.keytab.Keytab;
+import org.apache.kerberos.kerb.keytab.KeytabEntry;
+import org.apache.kerberos.kerb.KrbException;
+import org.apache.kerberos.kerb.spec.KerberosTime;
+import org.apache.kerberos.kerb.spec.common.EncryptionKey;
+import org.apache.kerberos.kerb.spec.common.EncryptionType;
+import org.apache.kerberos.kerb.spec.common.PrincipalName;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+import java.util.Properties;
+import java.util.UUID;
+
+public class TestKdcServer extends SimpleKdcServer {
+
+    public static final String ORG_DOMAIN = KdcConfigKey.KDC_DOMAIN.getPropertyKey();
+    public static final String KDC_REALM = KdcConfigKey.KDC_REALM.getPropertyKey();
+    public static final String KDC_HOST = KdcConfigKey.KDC_HOST.getPropertyKey();
+    public static final String KDC_PORT = KdcConfigKey.KDC_PORT.getPropertyKey();
+    public static final String WORK_DIR = KdcConfigKey.WORK_DIR.getPropertyKey();
+
+    private static final Properties DEFAULT_CONFIG = new Properties();
+    static {
+        DEFAULT_CONFIG.setProperty(KDC_HOST, "localhost");
+        DEFAULT_CONFIG.setProperty(KDC_PORT, "8018");
+        DEFAULT_CONFIG.setProperty(ORG_DOMAIN, "test.com");
+        DEFAULT_CONFIG.setProperty(KDC_REALM, "TEST.COM");
+    }
+
+    public static Properties createConf() {
+        return (Properties) DEFAULT_CONFIG.clone();
+    }
+
+    public TestKdcServer() {
+        this(createConf());
+    }
+
+    public TestKdcServer(Properties conf) {
+        super();
+        getConfig().getConf().addPropertiesConfig(conf);
+    }
+
+    @Override
+    public void init() {
+        super.init();
+
+        createPrincipals("krbtgt");
+    }
+
+    public String getKdcRealm() {
+        return getConfig().getKdcRealm();
+    }
+
+    public synchronized void createPrincipal(String principal, String password) {
+        KrbIdentity identity = new KrbIdentity(principal);
+        List<EncryptionType> encTypes = getConfig().getEncryptionTypes();
+        List<EncryptionKey> encKeys = null;
+        try {
+            encKeys = EncryptionUtil.generateKeys(fixPrincipal(principal), password, encTypes);
+        } catch (KrbException e) {
+            throw new RuntimeException("Failed to generate encryption keys", e);
+        }
+        identity.addKeys(encKeys);
+        getIdentityService().addIdentity(identity);
+    }
+
+    public void createPrincipals(String ... principals) {
+        String passwd;
+        for (String principal : principals) {
+            passwd = UUID.randomUUID().toString();
+            createPrincipal(fixPrincipal(principal), passwd);
+        }
+    }
+
+    private String fixPrincipal(String principal) {
+        if (! principal.contains("@")) {
+            principal += "@" + getKdcRealm();
+        }
+        return principal;
+    }
+
+    public void exportPrincipals(File keytabFile) throws IOException {
+        Keytab keytab = new Keytab();
+
+        List<KrbIdentity> identities = getIdentityService().getIdentities();
+        for (KrbIdentity identity : identities) {
+            PrincipalName principal = identity.getPrincipal();
+            KerberosTime timestamp = new KerberosTime();
+            for (EncryptionType encType : identity.getKeys().keySet()) {
+                EncryptionKey ekey = identity.getKeys().get(encType);
+                int keyVersion = ekey.getKvno();
+                keytab.addEntry(new KeytabEntry(principal, timestamp, keyVersion, ekey));
+            }
+        }
+
+        keytab.store(keytabFile);
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/967d7e1c/haox-kerb/kerb-kdc-test/src/main/java/org/haox/kerb/server/TestKdcServer.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-kdc-test/src/main/java/org/haox/kerb/server/TestKdcServer.java b/haox-kerb/kerb-kdc-test/src/main/java/org/haox/kerb/server/TestKdcServer.java
deleted file mode 100644
index cf94888..0000000
--- a/haox-kerb/kerb-kdc-test/src/main/java/org/haox/kerb/server/TestKdcServer.java
+++ /dev/null
@@ -1,103 +0,0 @@
-package org.haox.kerb.server;
-
-import org.haox.kerb.common.EncryptionUtil;
-import org.haox.kerb.identity.KrbIdentity;
-import org.haox.kerb.keytab.Keytab;
-import org.haox.kerb.keytab.KeytabEntry;
-import org.haox.kerb.KrbException;
-import org.haox.kerb.spec.KerberosTime;
-import org.haox.kerb.spec.common.EncryptionKey;
-import org.haox.kerb.spec.common.EncryptionType;
-import org.haox.kerb.spec.common.PrincipalName;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.List;
-import java.util.Properties;
-import java.util.UUID;
-
-public class TestKdcServer extends SimpleKdcServer {
-
-    public static final String ORG_DOMAIN = KdcConfigKey.KDC_DOMAIN.getPropertyKey();
-    public static final String KDC_REALM = KdcConfigKey.KDC_REALM.getPropertyKey();
-    public static final String KDC_HOST = KdcConfigKey.KDC_HOST.getPropertyKey();
-    public static final String KDC_PORT = KdcConfigKey.KDC_PORT.getPropertyKey();
-    public static final String WORK_DIR = KdcConfigKey.WORK_DIR.getPropertyKey();
-
-    private static final Properties DEFAULT_CONFIG = new Properties();
-    static {
-        DEFAULT_CONFIG.setProperty(KDC_HOST, "localhost");
-        DEFAULT_CONFIG.setProperty(KDC_PORT, "8018");
-        DEFAULT_CONFIG.setProperty(ORG_DOMAIN, "test.com");
-        DEFAULT_CONFIG.setProperty(KDC_REALM, "TEST.COM");
-    }
-
-    public static Properties createConf() {
-        return (Properties) DEFAULT_CONFIG.clone();
-    }
-
-    public TestKdcServer() {
-        this(createConf());
-    }
-
-    public TestKdcServer(Properties conf) {
-        super();
-        getConfig().getConf().addPropertiesConfig(conf);
-    }
-
-    @Override
-    public void init() {
-        super.init();
-
-        createPrincipals("krbtgt");
-    }
-
-    public String getKdcRealm() {
-        return getConfig().getKdcRealm();
-    }
-
-    public synchronized void createPrincipal(String principal, String password) {
-        KrbIdentity identity = new KrbIdentity(principal);
-        List<EncryptionType> encTypes = getConfig().getEncryptionTypes();
-        List<EncryptionKey> encKeys = null;
-        try {
-            encKeys = EncryptionUtil.generateKeys(fixPrincipal(principal), password, encTypes);
-        } catch (KrbException e) {
-            throw new RuntimeException("Failed to generate encryption keys", e);
-        }
-        identity.addKeys(encKeys);
-        getIdentityService().addIdentity(identity);
-    }
-
-    public void createPrincipals(String ... principals) {
-        String passwd;
-        for (String principal : principals) {
-            passwd = UUID.randomUUID().toString();
-            createPrincipal(fixPrincipal(principal), passwd);
-        }
-    }
-
-    private String fixPrincipal(String principal) {
-        if (! principal.contains("@")) {
-            principal += "@" + getKdcRealm();
-        }
-        return principal;
-    }
-
-    public void exportPrincipals(File keytabFile) throws IOException {
-        Keytab keytab = new Keytab();
-
-        List<KrbIdentity> identities = getIdentityService().getIdentities();
-        for (KrbIdentity identity : identities) {
-            PrincipalName principal = identity.getPrincipal();
-            KerberosTime timestamp = new KerberosTime();
-            for (EncryptionType encType : identity.getKeys().keySet()) {
-                EncryptionKey ekey = identity.getKeys().get(encType);
-                int keyVersion = ekey.getKvno();
-                keytab.addEntry(new KeytabEntry(principal, timestamp, keyVersion, ekey));
-            }
-        }
-
-        keytab.store(keytabFile);
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/967d7e1c/haox-kerb/kerb-kdc-test/src/test/java/org/apache/kerberos/kerb/server/KdcTest.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-kdc-test/src/test/java/org/apache/kerberos/kerb/server/KdcTest.java b/haox-kerb/kerb-kdc-test/src/test/java/org/apache/kerberos/kerb/server/KdcTest.java
new file mode 100644
index 0000000..c199c44
--- /dev/null
+++ b/haox-kerb/kerb-kdc-test/src/test/java/org/apache/kerberos/kerb/server/KdcTest.java
@@ -0,0 +1,30 @@
+package org.apache.kerberos.kerb.server;
+
+import org.apache.kerberos.kerb.spec.ticket.ServiceTicket;
+import org.apache.kerberos.kerb.spec.ticket.TgtTicket;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class KdcTest extends KdcTestBase {
+
+    private String password = "123456";
+
+    @Override
+    protected void setUpKdcServer() throws Exception {
+        super.setUpKdcServer();
+        kdcServer.createPrincipal(clientPrincipal, password);
+    }
+
+    @Test
+    public void testKdc() throws Exception {
+        kdcServer.start();
+        Assert.assertTrue(kdcServer.isStarted());
+
+        krbClnt.init();
+        TgtTicket tgt = krbClnt.requestTgtTicket(clientPrincipal, password, null);
+        Assert.assertNotNull(tgt);
+
+        ServiceTicket tkt = krbClnt.requestServiceTicket(tgt, serverPrincipal, null);
+        Assert.assertNotNull(tkt);
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/967d7e1c/haox-kerb/kerb-kdc-test/src/test/java/org/apache/kerberos/kerb/server/KdcTestBase.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-kdc-test/src/test/java/org/apache/kerberos/kerb/server/KdcTestBase.java b/haox-kerb/kerb-kdc-test/src/test/java/org/apache/kerberos/kerb/server/KdcTestBase.java
new file mode 100644
index 0000000..56f7741
--- /dev/null
+++ b/haox-kerb/kerb-kdc-test/src/test/java/org/apache/kerberos/kerb/server/KdcTestBase.java
@@ -0,0 +1,49 @@
+package org.apache.kerberos.kerb.server;
+
+import org.apache.kerberos.kerb.client.KrbClient;
+import org.apache.kerberos.kerb.server.TestKdcServer;
+import org.junit.After;
+import org.junit.Before;
+
+public abstract class KdcTestBase {
+
+    protected String kdcRealm;
+    protected String clientPrincipal;
+    protected String serverPrincipal;
+
+    protected String hostname = "localhost";
+    protected short port = 8088;
+
+    protected TestKdcServer kdcServer;
+    protected KrbClient krbClnt;
+
+    @Before
+    public void setUp() throws Exception {
+        setUpKdcServer();
+        setUpClient();
+    }
+
+    protected void setUpKdcServer() throws Exception {
+        kdcServer = new TestKdcServer();
+        kdcServer.setKdcHost(hostname);
+        kdcServer.setKdcPort(port);
+        kdcServer.init();
+
+        kdcRealm = kdcServer.getKdcRealm();
+        clientPrincipal = "drankye@" + kdcRealm;
+
+        serverPrincipal = "test-service/localhost@" + kdcRealm;
+        kdcServer.createPrincipals(serverPrincipal);
+    }
+
+    protected void setUpClient() throws Exception {
+        krbClnt = new KrbClient(hostname, port);
+        krbClnt.setTimeout(5);
+        krbClnt.setKdcRealm(kdcServer.getKdcRealm());
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        kdcServer.stop();
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/967d7e1c/haox-kerb/kerb-kdc-test/src/test/java/org/apache/kerberos/kerb/server/WithCertKdcTest.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-kdc-test/src/test/java/org/apache/kerberos/kerb/server/WithCertKdcTest.java b/haox-kerb/kerb-kdc-test/src/test/java/org/apache/kerberos/kerb/server/WithCertKdcTest.java
new file mode 100644
index 0000000..a242ec1
--- /dev/null
+++ b/haox-kerb/kerb-kdc-test/src/test/java/org/apache/kerberos/kerb/server/WithCertKdcTest.java
@@ -0,0 +1,71 @@
+package org.apache.kerberos.kerb.server;
+
+import org.apache.kerberos.kerb.KrbException;
+import org.apache.kerberos.kerb.spec.ticket.ServiceTicket;
+import org.apache.kerberos.kerb.spec.ticket.TgtTicket;
+import org.haox.pki.Pkix;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.security.GeneralSecurityException;
+import java.security.PrivateKey;
+import java.security.cert.Certificate;
+
+/**
+ openssl genrsa -out cakey.pem 2048
+ openssl req -key cakey.pem -new -x509 -out cacert.pem -days 3650
+ vi extensions.kdc
+ openssl genrsa -out kdckey.pem 2048
+ openssl req -new -out kdc.req -key kdckey.pem
+ env REALM=SH.INTEL.COM openssl x509 -req -in kdc.req -CAkey cakey.pem \
+ -CA cacert.pem -out kdc.pem -days 365 -extfile extensions.kdc -extensions kdc_cert -CAcreateserial
+ */
+public class WithCertKdcTest extends KdcTestBase {
+
+    private Certificate userCert;
+    private PrivateKey userKey;
+
+    @Override
+    protected void setUpClient() throws Exception {
+        super.setUpClient();
+
+        loadCredentials();
+    }
+
+    @Override
+    protected void setUpKdcServer() throws Exception {
+        super.setUpKdcServer();
+        kdcServer.createPrincipals(clientPrincipal);
+    }
+
+    @Test
+    public void testKdc() throws Exception {
+        Assert.assertNotNull(userCert);
+
+        kdcServer.start();
+        Assert.assertTrue(kdcServer.isStarted());
+        krbClnt.init();
+
+        TgtTicket tgt = null;
+        try {
+            tgt = krbClnt.requestTgtTicket(clientPrincipal, userCert, userKey, null);
+        } catch (KrbException te) {
+            Assert.assertTrue(te.getMessage().contains("timeout"));
+            return;
+        }
+        Assert.assertNull(tgt);
+
+        ServiceTicket tkt = krbClnt.requestServiceTicket(tgt, serverPrincipal, null);
+        Assert.assertNull(tkt);
+    }
+
+    private void loadCredentials() throws IOException, GeneralSecurityException {
+        InputStream res = getClass().getResourceAsStream("/usercert.pem");
+        userCert = Pkix.getCerts(res).iterator().next();
+
+        res = getClass().getResourceAsStream("/userkey.pem");
+        userKey = Pkix.getPrivateKey(res, null);
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/967d7e1c/haox-kerb/kerb-kdc-test/src/test/java/org/apache/kerberos/kerb/server/WithTokenKdcTest.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-kdc-test/src/test/java/org/apache/kerberos/kerb/server/WithTokenKdcTest.java b/haox-kerb/kerb-kdc-test/src/test/java/org/apache/kerberos/kerb/server/WithTokenKdcTest.java
new file mode 100644
index 0000000..e6b2f49
--- /dev/null
+++ b/haox-kerb/kerb-kdc-test/src/test/java/org/apache/kerberos/kerb/server/WithTokenKdcTest.java
@@ -0,0 +1,38 @@
+package org.apache.kerberos.kerb.server;
+
+import org.apache.kerberos.kerb.KrbException;
+import org.apache.kerberos.kerb.spec.ticket.ServiceTicket;
+import org.apache.kerberos.kerb.spec.ticket.TgtTicket;
+import org.haox.token.KerbToken;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class WithTokenKdcTest extends KdcTestBase {
+
+    private KerbToken token;
+
+    @Override
+    protected void setUpKdcServer() throws Exception {
+        super.setUpKdcServer();
+        kdcServer.createPrincipals(clientPrincipal);
+    }
+
+    @Test
+    public void testKdc() throws Exception {
+        kdcServer.start();
+        Assert.assertTrue(kdcServer.isStarted());
+        krbClnt.init();
+
+        TgtTicket tgt = null;
+        try {
+            tgt = krbClnt.requestTgtTicket(clientPrincipal, token, null);
+        } catch (KrbException te) {
+            Assert.assertTrue(te.getMessage().contains("timeout"));
+            return;
+        }
+        Assert.assertNull(tgt);
+
+        ServiceTicket tkt = krbClnt.requestServiceTicket(tgt, serverPrincipal, null);
+        Assert.assertNull(tkt);
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/967d7e1c/haox-kerb/kerb-kdc-test/src/test/java/org/haox/kerb/server/KdcTest.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-kdc-test/src/test/java/org/haox/kerb/server/KdcTest.java b/haox-kerb/kerb-kdc-test/src/test/java/org/haox/kerb/server/KdcTest.java
deleted file mode 100644
index 92c4cf0..0000000
--- a/haox-kerb/kerb-kdc-test/src/test/java/org/haox/kerb/server/KdcTest.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package org.haox.kerb.server;
-
-import org.haox.kerb.spec.ticket.ServiceTicket;
-import org.haox.kerb.spec.ticket.TgtTicket;
-import org.junit.Assert;
-import org.junit.Test;
-
-public class KdcTest extends KdcTestBase {
-
-    private String password = "123456";
-
-    @Override
-    protected void setUpKdcServer() throws Exception {
-        super.setUpKdcServer();
-        kdcServer.createPrincipal(clientPrincipal, password);
-    }
-
-    @Test
-    public void testKdc() throws Exception {
-        kdcServer.start();
-        Assert.assertTrue(kdcServer.isStarted());
-
-        krbClnt.init();
-        TgtTicket tgt = krbClnt.requestTgtTicket(clientPrincipal, password, null);
-        Assert.assertNotNull(tgt);
-
-        ServiceTicket tkt = krbClnt.requestServiceTicket(tgt, serverPrincipal, null);
-        Assert.assertNotNull(tkt);
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/967d7e1c/haox-kerb/kerb-kdc-test/src/test/java/org/haox/kerb/server/KdcTestBase.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-kdc-test/src/test/java/org/haox/kerb/server/KdcTestBase.java b/haox-kerb/kerb-kdc-test/src/test/java/org/haox/kerb/server/KdcTestBase.java
deleted file mode 100644
index 2b26e2a..0000000
--- a/haox-kerb/kerb-kdc-test/src/test/java/org/haox/kerb/server/KdcTestBase.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package org.haox.kerb.server;
-
-import org.haox.kerb.client.KrbClient;
-import org.junit.After;
-import org.junit.Before;
-
-public abstract class KdcTestBase {
-
-    protected String kdcRealm;
-    protected String clientPrincipal;
-    protected String serverPrincipal;
-
-    protected String hostname = "localhost";
-    protected short port = 8088;
-
-    protected TestKdcServer kdcServer;
-    protected KrbClient krbClnt;
-
-    @Before
-    public void setUp() throws Exception {
-        setUpKdcServer();
-        setUpClient();
-    }
-
-    protected void setUpKdcServer() throws Exception {
-        kdcServer = new TestKdcServer();
-        kdcServer.setKdcHost(hostname);
-        kdcServer.setKdcPort(port);
-        kdcServer.init();
-
-        kdcRealm = kdcServer.getKdcRealm();
-        clientPrincipal = "drankye@" + kdcRealm;
-
-        serverPrincipal = "test-service/localhost@" + kdcRealm;
-        kdcServer.createPrincipals(serverPrincipal);
-    }
-
-    protected void setUpClient() throws Exception {
-        krbClnt = new KrbClient(hostname, port);
-        krbClnt.setTimeout(5);
-        krbClnt.setKdcRealm(kdcServer.getKdcRealm());
-    }
-
-    @After
-    public void tearDown() throws Exception {
-        kdcServer.stop();
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/967d7e1c/haox-kerb/kerb-kdc-test/src/test/java/org/haox/kerb/server/WithCertKdcTest.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-kdc-test/src/test/java/org/haox/kerb/server/WithCertKdcTest.java b/haox-kerb/kerb-kdc-test/src/test/java/org/haox/kerb/server/WithCertKdcTest.java
deleted file mode 100644
index 21658bc..0000000
--- a/haox-kerb/kerb-kdc-test/src/test/java/org/haox/kerb/server/WithCertKdcTest.java
+++ /dev/null
@@ -1,71 +0,0 @@
-package org.haox.kerb.server;
-
-import org.haox.kerb.KrbException;
-import org.haox.kerb.spec.ticket.ServiceTicket;
-import org.haox.kerb.spec.ticket.TgtTicket;
-import org.haox.pki.Pkix;
-import org.junit.Assert;
-import org.junit.Test;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.security.GeneralSecurityException;
-import java.security.PrivateKey;
-import java.security.cert.Certificate;
-
-/**
- openssl genrsa -out cakey.pem 2048
- openssl req -key cakey.pem -new -x509 -out cacert.pem -days 3650
- vi extensions.kdc
- openssl genrsa -out kdckey.pem 2048
- openssl req -new -out kdc.req -key kdckey.pem
- env REALM=SH.INTEL.COM openssl x509 -req -in kdc.req -CAkey cakey.pem \
- -CA cacert.pem -out kdc.pem -days 365 -extfile extensions.kdc -extensions kdc_cert -CAcreateserial
- */
-public class WithCertKdcTest extends KdcTestBase {
-
-    private Certificate userCert;
-    private PrivateKey userKey;
-
-    @Override
-    protected void setUpClient() throws Exception {
-        super.setUpClient();
-
-        loadCredentials();
-    }
-
-    @Override
-    protected void setUpKdcServer() throws Exception {
-        super.setUpKdcServer();
-        kdcServer.createPrincipals(clientPrincipal);
-    }
-
-    @Test
-    public void testKdc() throws Exception {
-        Assert.assertNotNull(userCert);
-
-        kdcServer.start();
-        Assert.assertTrue(kdcServer.isStarted());
-        krbClnt.init();
-
-        TgtTicket tgt = null;
-        try {
-            tgt = krbClnt.requestTgtTicket(clientPrincipal, userCert, userKey, null);
-        } catch (KrbException te) {
-            Assert.assertTrue(te.getMessage().contains("timeout"));
-            return;
-        }
-        Assert.assertNull(tgt);
-
-        ServiceTicket tkt = krbClnt.requestServiceTicket(tgt, serverPrincipal, null);
-        Assert.assertNull(tkt);
-    }
-
-    private void loadCredentials() throws IOException, GeneralSecurityException {
-        InputStream res = getClass().getResourceAsStream("/usercert.pem");
-        userCert = Pkix.getCerts(res).iterator().next();
-
-        res = getClass().getResourceAsStream("/userkey.pem");
-        userKey = Pkix.getPrivateKey(res, null);
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/967d7e1c/haox-kerb/kerb-kdc-test/src/test/java/org/haox/kerb/server/WithTokenKdcTest.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-kdc-test/src/test/java/org/haox/kerb/server/WithTokenKdcTest.java b/haox-kerb/kerb-kdc-test/src/test/java/org/haox/kerb/server/WithTokenKdcTest.java
deleted file mode 100644
index b2edd95..0000000
--- a/haox-kerb/kerb-kdc-test/src/test/java/org/haox/kerb/server/WithTokenKdcTest.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package org.haox.kerb.server;
-
-import org.haox.kerb.KrbException;
-import org.haox.kerb.spec.ticket.ServiceTicket;
-import org.haox.kerb.spec.ticket.TgtTicket;
-import org.haox.token.KerbToken;
-import org.junit.Assert;
-import org.junit.Test;
-
-public class WithTokenKdcTest extends KdcTestBase {
-
-    private KerbToken token;
-
-    @Override
-    protected void setUpKdcServer() throws Exception {
-        super.setUpKdcServer();
-        kdcServer.createPrincipals(clientPrincipal);
-    }
-
-    @Test
-    public void testKdc() throws Exception {
-        kdcServer.start();
-        Assert.assertTrue(kdcServer.isStarted());
-        krbClnt.init();
-
-        TgtTicket tgt = null;
-        try {
-            tgt = krbClnt.requestTgtTicket(clientPrincipal, token, null);
-        } catch (KrbException te) {
-            Assert.assertTrue(te.getMessage().contains("timeout"));
-            return;
-        }
-        Assert.assertNull(tgt);
-
-        ServiceTicket tkt = krbClnt.requestServiceTicket(tgt, serverPrincipal, null);
-        Assert.assertNull(tkt);
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/967d7e1c/haox-kerb/kerb-kdc-test/src/test/resources/kdc-krb5.conf
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-kdc-test/src/test/resources/kdc-krb5.conf b/haox-kerb/kerb-kdc-test/src/test/resources/kdc-krb5.conf
deleted file mode 100644
index d118dd1..0000000
--- a/haox-kerb/kerb-kdc-test/src/test/resources/kdc-krb5.conf
+++ /dev/null
@@ -1,25 +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.
-#
-[libdefaults]
-    default_realm = {0}
-    udp_preference_limit = 1
-
-[realms]
-    {0} = '{'
-        kdc = {1}:{2}
-    '}'
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/967d7e1c/haox-kerb/kerb-kdc-test/src/test/resources/kdc.ldiff
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-kdc-test/src/test/resources/kdc.ldiff b/haox-kerb/kerb-kdc-test/src/test/resources/kdc.ldiff
deleted file mode 100644
index e344131..0000000
--- a/haox-kerb/kerb-kdc-test/src/test/resources/kdc.ldiff
+++ /dev/null
@@ -1,30 +0,0 @@
-dn: ou=users,dc=${0},dc=${1}
-objectClass: organizationalUnit
-objectClass: top
-ou: users
-
-dn: uid=krbtgt,ou=users,dc=${0},dc=${1}
-objectClass: top
-objectClass: person
-objectClass: inetOrgPerson
-objectClass: krb5principal
-objectClass: krb5kdcentry
-cn: KDC Service
-sn: Service
-uid: krbtgt
-userPassword: secret
-krb5PrincipalName: krbtgt/${2}.${3}@${2}.${3}
-krb5KeyVersionNumber: 0
-
-dn: uid=ldap,ou=users,dc=${0},dc=${1}
-objectClass: top
-objectClass: person
-objectClass: inetOrgPerson
-objectClass: krb5principal
-objectClass: krb5kdcentry
-cn: LDAP
-sn: Service
-uid: ldap
-userPassword: secret
-krb5PrincipalName: ldap/${4}@${2}.${3}
-krb5KeyVersionNumber: 0
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/967d7e1c/haox-kerb/kerb-server/src/main/java/org/apache/kerberos/kerb/server/KdcConfig.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-server/src/main/java/org/apache/kerberos/kerb/server/KdcConfig.java b/haox-kerb/kerb-server/src/main/java/org/apache/kerberos/kerb/server/KdcConfig.java
new file mode 100644
index 0000000..8afff46
--- /dev/null
+++ b/haox-kerb/kerb-server/src/main/java/org/apache/kerberos/kerb/server/KdcConfig.java
@@ -0,0 +1,105 @@
+package org.apache.kerberos.kerb.server;
+
+import org.apache.haox.config.Conf;
+import org.apache.kerberos.kerb.common.KrbConfHelper;
+import org.apache.kerberos.kerb.spec.common.EncryptionType;
+
+import java.util.List;
+
+public class KdcConfig {
+    protected Conf conf;
+
+    public KdcConfig() {
+        this.conf = new Conf();
+    }
+
+    public Conf getConf() {
+        return this.conf;
+    }
+
+    public boolean enableDebug() {
+        return conf.getBoolean(KdcConfigKey.KRB_DEBUG);
+    }
+
+    public String getKdcServiceName() {
+        return conf.getString(KdcConfigKey.KDC_SERVICE_NAME);
+    }
+
+    public String getWorkDir() {
+        return conf.getString(KdcConfigKey.WORK_DIR);
+    }
+
+    public String getKdcHost() {
+        return conf.getString(KdcConfigKey.KDC_HOST);
+    }
+
+    public short getKdcPort() {
+        Integer kdcPort = conf.getInt(KdcConfigKey.KDC_PORT);
+        return kdcPort.shortValue();
+    }
+
+    public String getKdcRealm() {
+        return conf.getString(KdcConfigKey.KDC_REALM);
+    }
+
+    public String getKdcDomain() {
+        return conf.getString(KdcConfigKey.KDC_DOMAIN);
+    }
+
+    public boolean isPreauthRequired() {
+        return conf.getBoolean(KdcConfigKey.PREAUTH_REQUIRED);
+    }
+
+    public String getTgsPrincipal() {
+        return conf.getString(KdcConfigKey.TGS_PRINCIPAL);
+    }
+
+    public long getAllowableClockSkew() {
+        return conf.getLong(KdcConfigKey.ALLOWABLE_CLOCKSKEW);
+    }
+
+    public boolean isEmptyAddressesAllowed() {
+        return conf.getBoolean(KdcConfigKey.EMPTY_ADDRESSES_ALLOWED);
+    }
+
+    public boolean isForwardableAllowed() {
+        return conf.getBoolean(KdcConfigKey.FORWARDABLE_ALLOWED);
+    }
+
+    public boolean isPostdatedAllowed() {
+        return conf.getBoolean(KdcConfigKey.POSTDATED_ALLOWED);
+    }
+
+    public boolean isProxiableAllowed() {
+        return conf.getBoolean(KdcConfigKey.PROXIABLE_ALLOWED);
+    }
+
+    public boolean isRenewableAllowed() {
+        return conf.getBoolean(KdcConfigKey.RENEWABLE_ALLOWED);
+    }
+
+    public long getMaximumRenewableLifetime() {
+        return conf.getLong(KdcConfigKey.MAXIMUM_RENEWABLE_LIFETIME);
+    }
+
+    public long getMaximumTicketLifetime() {
+        return conf.getLong(KdcConfigKey.MAXIMUM_TICKET_LIFETIME);
+    }
+
+    public long getMinimumTicketLifetime() {
+        return conf.getLong(KdcConfigKey.MINIMUM_TICKET_LIFETIME);
+    }
+
+    public List<EncryptionType> getEncryptionTypes() {
+        List<String> eTypes = conf.getList(KdcConfigKey.ENCRYPTION_TYPES);
+        return KrbConfHelper.getEncryptionTypes(eTypes);
+    }
+
+    public boolean isPaEncTimestampRequired() {
+        return conf.getBoolean(KdcConfigKey.PA_ENC_TIMESTAMP_REQUIRED);
+    }
+
+    public boolean isBodyChecksumVerified() {
+        return conf.getBoolean(KdcConfigKey.VERIFY_BODY_CHECKSUM);
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/967d7e1c/haox-kerb/kerb-server/src/main/java/org/apache/kerberos/kerb/server/KdcConfigKey.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-server/src/main/java/org/apache/kerberos/kerb/server/KdcConfigKey.java b/haox-kerb/kerb-server/src/main/java/org/apache/kerberos/kerb/server/KdcConfigKey.java
new file mode 100644
index 0000000..fde73c7
--- /dev/null
+++ b/haox-kerb/kerb-server/src/main/java/org/apache/kerberos/kerb/server/KdcConfigKey.java
@@ -0,0 +1,47 @@
+package org.apache.kerberos.kerb.server;
+
+import org.apache.haox.config.ConfigKey;
+
+public enum KdcConfigKey implements ConfigKey {
+    KRB_DEBUG(true),
+    WORK_DIR,
+    KDC_SERVICE_NAME("Haox_KDC_Server"),
+    KDC_HOST("127.0.0.1"),
+    KDC_PORT(8015),
+    KDC_DOMAIN("example.com"),
+    KDC_REALM("EXAMPLE.COM"),
+    TGS_PRINCIPAL("krbtgt@EXAMPLE.COM"),
+    PREAUTH_REQUIRED(true),
+    ALLOWABLE_CLOCKSKEW(5 * 60L),
+    EMPTY_ADDRESSES_ALLOWED(true),
+    PA_ENC_TIMESTAMP_REQUIRED(true),
+    MAXIMUM_TICKET_LIFETIME(24 * 3600L),
+    MINIMUM_TICKET_LIFETIME(1 * 3600L),
+    MAXIMUM_RENEWABLE_LIFETIME(48 * 3600L),
+    FORWARDABLE_ALLOWED(true),
+    POSTDATED_ALLOWED(true),
+    PROXIABLE_ALLOWED(true),
+    RENEWABLE_ALLOWED(true),
+    VERIFY_BODY_CHECKSUM(true),
+    ENCRYPTION_TYPES(new String[] { "aes128-cts-hmac-sha1-96", "des-cbc-md5", "des3-cbc-sha1-kd" });
+
+    private Object defaultValue;
+
+    private KdcConfigKey() {
+        this.defaultValue = null;
+    }
+
+    private KdcConfigKey(Object defaultValue) {
+        this.defaultValue = defaultValue;
+    }
+
+    @Override
+    public String getPropertyKey() {
+        return "kdc." + name().toLowerCase();
+    }
+
+    @Override
+    public Object getDefaultValue() {
+        return this.defaultValue;
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/967d7e1c/haox-kerb/kerb-server/src/main/java/org/apache/kerberos/kerb/server/KdcContext.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-server/src/main/java/org/apache/kerberos/kerb/server/KdcContext.java b/haox-kerb/kerb-server/src/main/java/org/apache/kerberos/kerb/server/KdcContext.java
new file mode 100644
index 0000000..3b090f7
--- /dev/null
+++ b/haox-kerb/kerb-server/src/main/java/org/apache/kerberos/kerb/server/KdcContext.java
@@ -0,0 +1,72 @@
+package org.apache.kerberos.kerb.server;
+
+import org.apache.kerberos.kerb.identity.IdentityService;
+import org.apache.kerberos.kerb.server.preauth.PreauthHandler;
+import org.apache.kerberos.kerb.server.replay.ReplayCheckService;
+
+import java.util.List;
+
+public class KdcContext {
+    private KdcConfig config;
+    private List<String> supportedKdcRealms;
+    private String kdcRealm;
+    private IdentityService identityService;
+    private ReplayCheckService replayCache;
+    private PreauthHandler preauthHandler;
+
+    public void init(KdcConfig config) {
+        this.config = config;
+    }
+
+    public KdcConfig getConfig() {
+        return config;
+    }
+
+    public void setPreauthHandler(PreauthHandler preauthHandler) {
+        this.preauthHandler = preauthHandler;
+    }
+
+    public PreauthHandler getPreauthHandler() {
+        return this.preauthHandler;
+    }
+
+    public List<String> getSupportedKdcRealms() {
+        return supportedKdcRealms;
+    }
+
+    public void setSupportedKdcRealms(List<String> supportedKdcRealms) {
+        this.supportedKdcRealms = supportedKdcRealms;
+    }
+
+    public void setKdcRealm(String realm) {
+        this.kdcRealm = realm;
+    }
+
+    public String getServerRealm() {
+        return config.getKdcRealm();
+    }
+
+    public String getKdcRealm() {
+        if (kdcRealm != null) {
+            return kdcRealm;
+        }
+        return config.getKdcRealm();
+    }
+
+    public void setReplayCache(ReplayCheckService replayCache) {
+        this.replayCache = replayCache;
+    }
+
+    public ReplayCheckService getReplayCache() {
+        return replayCache;
+    }
+
+    public void setIdentityService(IdentityService identityService) {
+        this.identityService = identityService;
+    }
+
+
+    public IdentityService getIdentityService() {
+        return identityService;
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/967d7e1c/haox-kerb/kerb-server/src/main/java/org/apache/kerberos/kerb/server/KdcHandler.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-server/src/main/java/org/apache/kerberos/kerb/server/KdcHandler.java b/haox-kerb/kerb-server/src/main/java/org/apache/kerberos/kerb/server/KdcHandler.java
new file mode 100644
index 0000000..fc0ebc5
--- /dev/null
+++ b/haox-kerb/kerb-server/src/main/java/org/apache/kerberos/kerb/server/KdcHandler.java
@@ -0,0 +1,129 @@
+package org.apache.kerberos.kerb.server;
+
+import org.apache.kerberos.kerb.common.KrbUtil;
+import org.apache.kerberos.kerb.identity.IdentityService;
+import org.apache.kerberos.kerb.server.preauth.PreauthHandler;
+import org.apache.kerberos.kerb.server.replay.ReplayCheckService;
+import org.apache.kerberos.kerb.server.request.AsRequest;
+import org.apache.kerberos.kerb.server.request.KdcRequest;
+import org.apache.kerberos.kerb.server.request.TgsRequest;
+import org.apache.kerberos.kerb.KrbException;
+import org.apache.kerberos.kerb.spec.common.KrbMessage;
+import org.apache.kerberos.kerb.spec.common.KrbMessageType;
+import org.apache.kerberos.kerb.spec.kdc.AsReq;
+import org.apache.kerberos.kerb.spec.kdc.KdcReq;
+import org.apache.kerberos.kerb.spec.kdc.TgsReq;
+import org.apache.haox.transport.MessageHandler;
+import org.apache.haox.transport.Transport;
+import org.apache.haox.transport.event.MessageEvent;
+import org.apache.haox.transport.tcp.TcpTransport;
+
+import java.net.InetSocketAddress;
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class KdcHandler extends MessageHandler {
+
+    private List<String> kdcRealms = new ArrayList<String>(1);
+    private Map<String, KdcContext> kdcContexts;
+
+    private KdcConfig kdcConfig;
+    private PreauthHandler preauthHandler;
+
+    // TODO: per realm for below
+    private IdentityService identityService;
+    private ReplayCheckService replayCheckService;
+
+    /**
+     * Should be called when all the necessary properties are set
+     */
+    public void init() {
+        loadKdcRealms();
+
+        preauthHandler = new PreauthHandler();
+        preauthHandler.init(kdcConfig);
+
+        kdcContexts = new HashMap<String, KdcContext>(1);
+        for (String realm : kdcRealms) {
+            initRealmContext(realm);
+        }
+    }
+
+    private void initRealmContext(String kdcRealm) {
+        KdcContext kdcContext = new KdcContext();
+        kdcContext.init(kdcConfig);
+        kdcContext.setKdcRealm(kdcRealm);
+        kdcContext.setPreauthHandler(preauthHandler);
+        kdcContext.setIdentityService(identityService);
+        kdcContext.setReplayCache(replayCheckService);
+
+        kdcContexts.put(kdcRealm, kdcContext);
+    }
+
+    public void setKdcRealm(String realm) {
+        this.kdcRealms.add(realm);
+    }
+
+    public void setConfig(KdcConfig config) {
+        this.kdcConfig = config;
+    }
+
+    public void setIdentityService(IdentityService identityService) {
+        this.identityService = identityService;
+    }
+
+    @Override
+    protected void handleMessage(MessageEvent event) throws Exception {
+        ByteBuffer message = event.getMessage();
+        Transport transport = event.getTransport();
+
+        KrbMessage krbRequest = KrbUtil.decodeMessage(message);
+        KdcRequest kdcRequest = null;
+
+        KrbMessageType messageType = krbRequest.getMsgType();
+        if (messageType == KrbMessageType.TGS_REQ || messageType == KrbMessageType.AS_REQ) {
+            KdcReq kdcReq = (KdcReq) krbRequest;
+            String realm = getRequestRealm(kdcReq);
+            if (realm == null || !kdcContexts.containsKey(realm)) {
+                throw new KrbException("Invalid realm from kdc request: " + realm);
+            }
+
+            KdcContext kdcContext = kdcContexts.get(realm);
+            if (messageType == KrbMessageType.TGS_REQ) {
+                kdcRequest = new TgsRequest((TgsReq) kdcReq, kdcContext);
+            } else if (messageType == KrbMessageType.AS_REQ) {
+                kdcRequest = new AsRequest((AsReq) kdcReq, kdcContext);
+            }
+        }
+
+        InetSocketAddress clientAddress = transport.getRemoteAddress();
+        kdcRequest.setClientAddress(clientAddress.getAddress());
+        boolean isTcp = (transport instanceof TcpTransport);
+        kdcRequest.isTcp(isTcp);
+
+        kdcRequest.process();
+
+        KrbMessage krbResponse = kdcRequest.getReply();
+        KrbUtil.sendMessage(krbResponse, transport);
+    }
+
+    private void loadKdcRealms() {
+        if (kdcRealms.isEmpty()) {
+            kdcRealms.add(kdcConfig.getKdcRealm());
+        }
+    }
+
+    private String getRequestRealm(KdcReq kdcReq) {
+        String realm = kdcReq.getReqBody().getRealm();
+        if (realm == null && kdcReq.getReqBody().getCname() != null) {
+            realm = kdcReq.getReqBody().getCname().getRealm();
+        }
+        if (realm == null || realm.isEmpty()) {
+            realm = "NULL-KDC-REALM";
+        }
+        return realm;
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/967d7e1c/haox-kerb/kerb-server/src/main/java/org/apache/kerberos/kerb/server/KdcServer.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-server/src/main/java/org/apache/kerberos/kerb/server/KdcServer.java b/haox-kerb/kerb-server/src/main/java/org/apache/kerberos/kerb/server/KdcServer.java
new file mode 100644
index 0000000..41ce0de
--- /dev/null
+++ b/haox-kerb/kerb-server/src/main/java/org/apache/kerberos/kerb/server/KdcServer.java
@@ -0,0 +1,164 @@
+package org.apache.kerberos.kerb.server;
+
+import org.apache.haox.event.EventHub;
+import org.apache.kerberos.kerb.common.KrbStreamingDecoder;
+import org.apache.kerberos.kerb.identity.IdentityService;
+import org.apache.haox.transport.Acceptor;
+import org.apache.haox.transport.tcp.TcpAcceptor;
+
+import java.io.File;
+
+public class KdcServer {
+    private String kdcHost;
+    private short kdcPort;
+    private String kdcRealm;
+
+    private boolean started;
+    private String serviceName = "HaoxKdc";
+
+    private KdcHandler kdcHandler;
+    private EventHub eventHub;
+
+    protected KdcConfig kdcConfig;
+    protected IdentityService identityService;
+    protected File workDir;
+
+    public KdcServer() {
+        kdcConfig = new KdcConfig();
+    }
+
+    public void init() {
+        initConfig();
+
+        initWorkDir();
+    }
+
+    protected void initWorkDir() {
+        String path = kdcConfig.getWorkDir();
+        File file;
+        if (path != null) {
+            file = new File(path);
+            file.mkdirs();
+        } else {
+            file = new File(".");
+        }
+
+        this.workDir = file;
+    }
+
+    protected void initConfig() {}
+
+    public void start() {
+        try {
+            doStart();
+        } catch (Exception e) {
+            throw new RuntimeException("Failed to start " + getServiceName(), e);
+        }
+
+        started = true;
+    }
+
+    public String getKdcRealm() {
+        if (kdcRealm != null) {
+            return kdcRealm;
+        }
+        return kdcConfig.getKdcRealm();
+    }
+
+    private String getKdcHost() {
+        if (kdcHost != null) {
+            return kdcHost;
+        }
+        return kdcConfig.getKdcHost();
+    }
+
+    private short getKdcPort() {
+        if (kdcPort > 0) {
+            return kdcPort;
+        }
+        return kdcConfig.getKdcPort();
+    }
+
+    public void setKdcHost(String kdcHost) {
+        this.kdcHost = kdcHost;
+    }
+
+    public void setKdcPort(short kdcPort) {
+        this.kdcPort = kdcPort;
+    }
+
+    public void setKdcRealm(String realm) {
+        this.kdcRealm = realm;
+    }
+
+    public boolean enableDebug() {
+        return kdcConfig.enableDebug();
+    }
+
+    protected void doStart() throws Exception {
+        prepareHandler();
+
+        this.eventHub = new EventHub();
+
+        eventHub.register(kdcHandler);
+
+        Acceptor acceptor = new TcpAcceptor(new KrbStreamingDecoder());
+        eventHub.register(acceptor);
+
+        eventHub.start();
+        acceptor.listen(getKdcHost(), getKdcPort());
+    }
+
+    private void prepareHandler() {
+        this.kdcHandler = new KdcHandler();
+        kdcHandler.setConfig(kdcConfig);
+        kdcHandler.setIdentityService(identityService);
+        if (kdcRealm != null) {
+            kdcHandler.setKdcRealm(kdcRealm);
+        }
+        kdcHandler.init();
+    }
+
+    public void stop() {
+        try {
+            doStop();
+        } catch (Exception e) {
+            throw new RuntimeException("Failed to stop " + getServiceName());
+        }
+    }
+
+    protected void doStop() throws Exception {
+        eventHub.stop();
+    }
+
+    public KdcConfig getConfig() {
+        return kdcConfig;
+    }
+
+    public boolean isStarted() {
+        return started;
+    }
+
+    protected void setStarted( boolean started ) {
+        this.started = started;
+    }
+
+    protected void setServiceName( String name ) {
+        this.serviceName = name;
+    }
+
+    protected String getServiceName() {
+        if (serviceName != null) {
+            return serviceName;
+        }
+        return kdcConfig.getKdcServiceName();
+    }
+
+    public IdentityService getIdentityService() {
+        return identityService;
+    }
+
+    protected void setIdentityService(IdentityService identityService) {
+        this.identityService = identityService;
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/967d7e1c/haox-kerb/kerb-server/src/main/java/org/apache/kerberos/kerb/server/SimpleKdcServer.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-server/src/main/java/org/apache/kerberos/kerb/server/SimpleKdcServer.java b/haox-kerb/kerb-server/src/main/java/org/apache/kerberos/kerb/server/SimpleKdcServer.java
new file mode 100644
index 0000000..cf85161
--- /dev/null
+++ b/haox-kerb/kerb-server/src/main/java/org/apache/kerberos/kerb/server/SimpleKdcServer.java
@@ -0,0 +1,24 @@
+package org.apache.kerberos.kerb.server;
+
+import org.apache.kerberos.kerb.identity.IdentityService;
+import org.apache.kerberos.kerb.identity.backend.SimpleIdentityBackend;
+
+import java.io.File;
+
+public class SimpleKdcServer extends KdcServer {
+
+    public SimpleKdcServer() {
+        super();
+    }
+
+    public void init() {
+        super.init();
+        initIdentityService();
+    }
+
+    protected void initIdentityService() {
+        File identityFile = new File(workDir, "simplekdb.dat");
+        IdentityService identityService = new SimpleIdentityBackend(identityFile);
+        setIdentityService(identityService);
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/967d7e1c/haox-kerb/kerb-server/src/main/java/org/apache/kerberos/kerb/server/preauth/AbstractPreauthPlugin.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-server/src/main/java/org/apache/kerberos/kerb/server/preauth/AbstractPreauthPlugin.java b/haox-kerb/kerb-server/src/main/java/org/apache/kerberos/kerb/server/preauth/AbstractPreauthPlugin.java
new file mode 100644
index 0000000..d23a7e3
--- /dev/null
+++ b/haox-kerb/kerb-server/src/main/java/org/apache/kerberos/kerb/server/preauth/AbstractPreauthPlugin.java
@@ -0,0 +1,72 @@
+package org.apache.kerberos.kerb.server.preauth;
+
+import org.apache.kerberos.kerb.preauth.PaFlags;
+import org.apache.kerberos.kerb.preauth.PluginRequestContext;
+import org.apache.kerberos.kerb.preauth.PreauthPluginMeta;
+import org.apache.kerberos.kerb.server.KdcContext;
+import org.apache.kerberos.kerb.server.request.KdcRequest;
+import org.apache.kerberos.kerb.KrbException;
+import org.apache.kerberos.kerb.spec.pa.PaData;
+import org.apache.kerberos.kerb.spec.pa.PaDataEntry;
+import org.apache.kerberos.kerb.spec.pa.PaDataType;
+
+public class AbstractPreauthPlugin implements KdcPreauth {
+
+    private PreauthPluginMeta pluginMeta;
+
+    public AbstractPreauthPlugin(PreauthPluginMeta meta) {
+        this.pluginMeta = meta;
+    }
+
+    @Override
+    public String getName() {
+        return pluginMeta.getName();
+    }
+
+    public int getVersion() {
+        return pluginMeta.getVersion();
+    }
+
+    public PaDataType[] getPaTypes() {
+        return pluginMeta.getPaTypes();
+    }
+
+    @Override
+    public void initWith(KdcContext kdcContext) {
+
+    }
+
+    @Override
+    public PluginRequestContext initRequestContext(KdcRequest kdcRequest) {
+        return null;
+    }
+
+    @Override
+    public void provideEdata(KdcRequest kdcRequest, PluginRequestContext requestContext,
+            PaData outPaData) throws KrbException {
+
+    }
+
+    @Override
+    public boolean verify(KdcRequest kdcRequest, PluginRequestContext requestContext,
+                          PaDataEntry paData) throws KrbException {
+        return false;
+    }
+
+    @Override
+    public void providePaData(KdcRequest kdcRequest, PluginRequestContext requestContext,
+                              PaData paData) {
+
+    }
+
+    @Override
+    public PaFlags getFlags(KdcRequest kdcRequest, PluginRequestContext requestContext,
+                            PaDataType paType) {
+        return null;
+    }
+
+    @Override
+    public void destroy() {
+
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/967d7e1c/haox-kerb/kerb-server/src/main/java/org/apache/kerberos/kerb/server/preauth/FastContext.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-server/src/main/java/org/apache/kerberos/kerb/server/preauth/FastContext.java b/haox-kerb/kerb-server/src/main/java/org/apache/kerberos/kerb/server/preauth/FastContext.java
new file mode 100644
index 0000000..e367fbf
--- /dev/null
+++ b/haox-kerb/kerb-server/src/main/java/org/apache/kerberos/kerb/server/preauth/FastContext.java
@@ -0,0 +1,17 @@
+package org.apache.kerberos.kerb.server.preauth;
+
+import org.apache.kerberos.kerb.spec.common.EncryptionKey;
+import org.apache.kerberos.kerb.spec.fast.FastOptions;
+import org.apache.kerberos.kerb.spec.fast.KrbFastArmor;
+import org.apache.kerberos.kerb.spec.kdc.KdcReq;
+
+public class FastContext {
+
+    public KdcReq fastOuterRequest;
+    public EncryptionKey armorKey;
+    public KrbFastArmor fastArmor;
+    public FastOptions fastOptions;
+    public int nonce;
+    public int fastFlags;
+
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/967d7e1c/haox-kerb/kerb-server/src/main/java/org/apache/kerberos/kerb/server/preauth/KdcPreauth.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-server/src/main/java/org/apache/kerberos/kerb/server/preauth/KdcPreauth.java b/haox-kerb/kerb-server/src/main/java/org/apache/kerberos/kerb/server/preauth/KdcPreauth.java
new file mode 100644
index 0000000..691a581
--- /dev/null
+++ b/haox-kerb/kerb-server/src/main/java/org/apache/kerberos/kerb/server/preauth/KdcPreauth.java
@@ -0,0 +1,62 @@
+package org.apache.kerberos.kerb.server.preauth;
+
+import org.apache.kerberos.kerb.preauth.PaFlags;
+import org.apache.kerberos.kerb.preauth.PluginRequestContext;
+import org.apache.kerberos.kerb.preauth.PreauthPluginMeta;
+import org.apache.kerberos.kerb.server.KdcContext;
+import org.apache.kerberos.kerb.server.request.KdcRequest;
+import org.apache.kerberos.kerb.KrbException;
+import org.apache.kerberos.kerb.spec.pa.PaData;
+import org.apache.kerberos.kerb.spec.pa.PaDataEntry;
+import org.apache.kerberos.kerb.spec.pa.PaDataType;
+
+/**
+ * KDC side preauth plugin module
+ */
+public interface KdcPreauth extends PreauthPluginMeta {
+
+    /**
+     * Initializing plugin context for each realm
+     */
+    public void initWith(KdcContext context);
+
+    /**
+     * Initializing request context
+     */
+    public PluginRequestContext initRequestContext(KdcRequest kdcRequest);
+
+    /**
+     * Optional: provide pa_data to send to the client as part of the "you need to
+     * use preauthentication" error.
+     */
+    public void provideEdata(KdcRequest kdcRequest, PluginRequestContext requestContext,
+                             PaData outPaData) throws KrbException;
+
+    /**
+     * Optional: verify preauthentication data sent by the client, setting the
+     * TKT_FLG_PRE_AUTH or TKT_FLG_HW_AUTH flag in the enc_tkt_reply's "flags"
+     * field as appropriate.
+     */
+    public boolean verify(KdcRequest kdcRequest, PluginRequestContext requestContext,
+                          PaDataEntry paData) throws KrbException;
+
+    /**
+     * Optional: generate preauthentication response data to send to the client as
+     * part of the AS-REP.
+     */
+    public void providePaData(KdcRequest kdcRequest, PluginRequestContext requestContext,
+                              PaData paData);
+
+    /**
+     * Return PA_REAL if pa_type is a real preauthentication type or PA_INFO if it is
+     * an informational type.
+     */
+    public PaFlags getFlags(KdcRequest kdcRequest, PluginRequestContext requestContext,
+                            PaDataType paType);
+
+    /**
+     * When exiting...
+     */
+    public void destroy();
+
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/967d7e1c/haox-kerb/kerb-server/src/main/java/org/apache/kerberos/kerb/server/preauth/PreauthContext.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-server/src/main/java/org/apache/kerberos/kerb/server/preauth/PreauthContext.java b/haox-kerb/kerb-server/src/main/java/org/apache/kerberos/kerb/server/preauth/PreauthContext.java
new file mode 100644
index 0000000..67aa7f7
--- /dev/null
+++ b/haox-kerb/kerb-server/src/main/java/org/apache/kerberos/kerb/server/preauth/PreauthContext.java
@@ -0,0 +1,25 @@
+package org.apache.kerberos.kerb.server.preauth;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class PreauthContext {
+    private boolean preauthRequired = true;
+    private List<PreauthHandle> handles = new ArrayList<PreauthHandle>(5);
+
+    public PreauthContext() {
+
+    }
+
+    public boolean isPreauthRequired() {
+        return preauthRequired;
+    }
+
+    public void setPreauthRequired(boolean preauthRequired) {
+        this.preauthRequired = preauthRequired;
+    }
+
+    public List<PreauthHandle> getHandles() {
+        return handles;
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/967d7e1c/haox-kerb/kerb-server/src/main/java/org/apache/kerberos/kerb/server/preauth/PreauthHandle.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-server/src/main/java/org/apache/kerberos/kerb/server/preauth/PreauthHandle.java b/haox-kerb/kerb-server/src/main/java/org/apache/kerberos/kerb/server/preauth/PreauthHandle.java
new file mode 100644
index 0000000..88ff628
--- /dev/null
+++ b/haox-kerb/kerb-server/src/main/java/org/apache/kerberos/kerb/server/preauth/PreauthHandle.java
@@ -0,0 +1,37 @@
+package org.apache.kerberos.kerb.server.preauth;
+
+import org.apache.kerberos.kerb.preauth.PluginRequestContext;
+import org.apache.kerberos.kerb.server.request.KdcRequest;
+import org.apache.kerberos.kerb.KrbException;
+import org.apache.kerberos.kerb.spec.pa.PaData;
+import org.apache.kerberos.kerb.spec.pa.PaDataEntry;
+
+public class PreauthHandle {
+
+    public KdcPreauth preauth;
+    public PluginRequestContext requestContext;
+
+    public PreauthHandle(KdcPreauth preauth) {
+        this.preauth = preauth;
+    }
+
+    public void initRequestContext(KdcRequest kdcRequest) {
+        requestContext = preauth.initRequestContext(kdcRequest);
+    }
+
+    public void provideEdata(KdcRequest kdcRequest, PaData outPaData) throws KrbException {
+        preauth.provideEdata(kdcRequest, requestContext, outPaData);
+    }
+
+    public void verify(KdcRequest kdcRequest, PaDataEntry paData) throws KrbException {
+        preauth.verify(kdcRequest, requestContext, paData);
+    }
+
+    public void providePaData(KdcRequest kdcRequest, PaData paData) {
+        preauth.providePaData(kdcRequest, requestContext, paData);
+    }
+
+    public void destroy() {
+        preauth.destroy();
+    }
+}

http://git-wip-us.apache.org/repos/asf/directory-kerberos/blob/967d7e1c/haox-kerb/kerb-server/src/main/java/org/apache/kerberos/kerb/server/preauth/PreauthHandler.java
----------------------------------------------------------------------
diff --git a/haox-kerb/kerb-server/src/main/java/org/apache/kerberos/kerb/server/preauth/PreauthHandler.java b/haox-kerb/kerb-server/src/main/java/org/apache/kerberos/kerb/server/preauth/PreauthHandler.java
new file mode 100644
index 0000000..2e2464f
--- /dev/null
+++ b/haox-kerb/kerb-server/src/main/java/org/apache/kerberos/kerb/server/preauth/PreauthHandler.java
@@ -0,0 +1,105 @@
+package org.apache.kerberos.kerb.server.preauth;
+
+import org.apache.kerberos.kerb.server.KdcConfig;
+import org.apache.kerberos.kerb.server.KdcContext;
+import org.apache.kerberos.kerb.server.preauth.builtin.EncTsPreauth;
+import org.apache.kerberos.kerb.server.preauth.builtin.TgtPreauth;
+import org.apache.kerberos.kerb.server.request.KdcRequest;
+import org.apache.kerberos.kerb.KrbException;
+import org.apache.kerberos.kerb.spec.pa.PaData;
+import org.apache.kerberos.kerb.spec.pa.PaDataEntry;
+import org.apache.kerberos.kerb.spec.pa.PaDataType;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class PreauthHandler {
+
+    private List<KdcPreauth> preauths;
+
+    /**
+     * Should be called only once, for global
+     */
+    public void init(KdcConfig kdcConfig) {
+        loadPreauthPlugins(kdcConfig);
+    }
+
+    private void loadPreauthPlugins(KdcConfig kdcConfig) {
+        preauths = new ArrayList<KdcPreauth>();
+
+        KdcPreauth preauth = new EncTsPreauth();
+        preauths.add(preauth);
+
+        preauth = new TgtPreauth();
+        preauths.add(preauth);
+    }
+
+    /**
+     * Should be called per realm
+     * @param context
+     */
+    public void initWith(KdcContext context) {
+        for (KdcPreauth preauth : preauths) {
+            preauth.initWith(context);
+        }
+    }
+
+    public PreauthContext preparePreauthContext(KdcRequest kdcRequest) {
+        PreauthContext preauthContext = new PreauthContext();
+
+        KdcContext kdcContext = kdcRequest.getKdcContext();
+        preauthContext.setPreauthRequired(kdcContext.getConfig().isPreauthRequired());
+
+        for (KdcPreauth preauth : preauths) {
+            PreauthHandle handle = new PreauthHandle(preauth);
+            handle.initRequestContext(kdcRequest);
+            preauthContext.getHandles().add(handle);
+        }
+
+        return preauthContext;
+    }
+
+    public void provideEdata(KdcRequest kdcRequest, PaData outPaData) throws KrbException {
+        PreauthContext preauthContext = kdcRequest.getPreauthContext();
+
+        for (PreauthHandle handle : preauthContext.getHandles()) {
+            handle.provideEdata(kdcRequest, outPaData);
+        }
+    }
+
+    public void verify(KdcRequest kdcRequest, PaData paData) throws KrbException {
+        for (PaDataEntry paEntry : paData.getElements()) {
+            PreauthHandle handle = findHandle(kdcRequest, paEntry.getPaDataType());
+            if (handle != null) {
+                handle.verify(kdcRequest, paEntry);
+            }
+        }
+    }
+
+    public void providePaData(KdcRequest kdcRequest, PaData paData) {
+        PreauthContext preauthContext = kdcRequest.getPreauthContext();
+
+        for (PreauthHandle handle : preauthContext.getHandles()) {
+            handle.providePaData(kdcRequest, paData);
+        }
+    }
+
+    private PreauthHandle findHandle(KdcRequest kdcRequest, PaDataType paType) {
+        PreauthContext preauthContext = kdcRequest.getPreauthContext();
+
+        for (PreauthHandle handle : preauthContext.getHandles()) {
+            for (PaDataType pt : handle.preauth.getPaTypes()) {
+                if (pt == paType) {
+                    return handle;
+                }
+            }
+        }
+        return null;
+    }
+
+    public void destroy() {
+        for (KdcPreauth preauth : preauths) {
+            preauth.destroy();
+        }
+    }
+}