You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by dr...@apache.org on 2015/04/13 00:59:09 UTC
directory-kerby git commit: Refactored internal implementations for
KrbClient and KdcServer with more tests added
Repository: directory-kerby
Updated Branches:
refs/heads/master 0633ad96c -> 8f312e5b3
Refactored internal implementations for KrbClient and KdcServer with more tests added
Project: http://git-wip-us.apache.org/repos/asf/directory-kerby/repo
Commit: http://git-wip-us.apache.org/repos/asf/directory-kerby/commit/8f312e5b
Tree: http://git-wip-us.apache.org/repos/asf/directory-kerby/tree/8f312e5b
Diff: http://git-wip-us.apache.org/repos/asf/directory-kerby/diff/8f312e5b
Branch: refs/heads/master
Commit: 8f312e5b3aec6ddd5739ad7b7ab1ef605950f347
Parents: 0633ad9
Author: Drankye <dr...@gmail.com>
Authored: Mon Apr 13 06:58:49 2015 +0800
Committer: Drankye <dr...@gmail.com>
Committed: Mon Apr 13 06:58:49 2015 +0800
----------------------------------------------------------------------
.../kerberos/kerb/client/InternalKrbClient.java | 69 ++++++++++++++++
.../kerby/kerberos/kerb/client/KrbClient.java | 5 +-
.../kerby/kerberos/kerb/client/KrbHandler.java | 82 +++++++++++++++++++
.../client/impl/AbstractInternalKrbClient.java | 5 +-
.../client/impl/DefaultInternalKrbClient.java | 83 +++++++++++++++++++
.../kerb/client/impl/DefaultKrbHandler.java | 58 ++++++++++++++
.../kerb/client/impl/InternalKrbClient.java | 69 ----------------
.../kerb/client/impl/InternalKrbClientImpl.java | 83 -------------------
.../kerberos/kerb/client/impl/KrbHandler.java | 72 -----------------
.../client/impl/event/EventBasedKrbClient.java | 48 ++---------
.../kerb/client/impl/event/EventKrbHandler.java | 50 +++++-------
.../kerb/client/request/KdcRequest.java | 11 ++-
.../kerb/common/KrbStreamingDecoder.java | 2 +-
.../kerby/kerberos/kerb/common/KrbUtil.java | 79 ------------------
.../kerb/transport/KrbTcpTransport.java | 15 ++--
.../kerby/kerberos/kerb/server/KdcTestBase.java | 28 ++++++-
.../kerb/server/KdcTestUsingEventClient.java | 35 ++++++++
.../kerb/server/KdcTestUsingEventKdc.java | 35 ++++++++
.../kerby/kerberos/kerb/server/KdcHandler.java | 15 +++-
.../kerby/kerberos/kerb/server/KdcServer.java | 4 +-
.../server/impl/DefaultInternalKdcServer.java | 84 ++++++++++++++++++++
.../kerby/transport/tcp/DecodingCallback.java | 2 +-
.../kerby/transport/tcp/TcpTransport.java | 8 +-
.../kerby/event/network/TestNetworkBase.java | 2 +-
.../org/apache/kerby/event/tcp/TestTcpBase.java | 2 +-
25 files changed, 534 insertions(+), 412 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/8f312e5b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/InternalKrbClient.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/InternalKrbClient.java b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/InternalKrbClient.java
new file mode 100644
index 0000000..b772599
--- /dev/null
+++ b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/InternalKrbClient.java
@@ -0,0 +1,69 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.kerby.kerberos.kerb.client;
+
+import org.apache.kerby.kerberos.kerb.KrbException;
+import org.apache.kerby.KOptions;
+import org.apache.kerby.kerberos.kerb.client.KrbSetting;
+import org.apache.kerby.kerberos.kerb.spec.base.AuthToken;
+import org.apache.kerby.kerberos.kerb.spec.ticket.ServiceTicket;
+import org.apache.kerby.kerberos.kerb.spec.ticket.TgtTicket;
+
+/**
+ * An internal krb client interface.
+ */
+public interface InternalKrbClient {
+
+ /**
+ * Init with all the necessary options.
+ * @param options
+ */
+ public void init(KOptions options) throws KrbException;
+
+ /**
+ * Get krb client settings.
+ * @return setting
+ */
+ public KrbSetting getSetting();
+
+ /**
+ * Request a Ticket Granting Ticket.
+ * @param requestOptions
+ * @return a TGT
+ * @throws KrbException
+ */
+ public TgtTicket requestTgtTicket(KOptions requestOptions) throws KrbException;
+
+ /**
+ * Request a service ticket using a TGT.
+ * @return service ticket
+ * @throws KrbException
+ */
+ public ServiceTicket requestServiceTicketWithTgt(TgtTicket tgt,
+ String serverPrincipal) throws KrbException;
+
+ /**
+ * Request a service ticket using an Access Token.
+ * @return service ticket
+ * @throws KrbException
+ */
+ public ServiceTicket requestServiceTicketWithAccessToken(AuthToken token,
+ String serverPrincipal) throws KrbException;
+}
http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/8f312e5b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/KrbClient.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/KrbClient.java b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/KrbClient.java
index 0bdd19d..70c38f7 100644
--- a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/KrbClient.java
+++ b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/KrbClient.java
@@ -21,9 +21,8 @@ package org.apache.kerby.kerberos.kerb.client;
import org.apache.kerby.KOptions;
import org.apache.kerby.kerberos.kerb.KrbException;
-import org.apache.kerby.kerberos.kerb.client.impl.InternalKrbClientImpl;
+import org.apache.kerby.kerberos.kerb.client.impl.DefaultInternalKrbClient;
import org.apache.kerby.kerberos.kerb.client.impl.event.EventBasedKrbClient;
-import org.apache.kerby.kerberos.kerb.client.impl.InternalKrbClient;
import org.apache.kerby.kerberos.kerb.spec.base.AuthToken;
import org.apache.kerby.kerberos.kerb.spec.ticket.ServiceTicket;
import org.apache.kerby.kerberos.kerb.spec.ticket.TgtTicket;
@@ -128,7 +127,7 @@ public class KrbClient {
if (commonOptions.contains(KrbOption.USE_EVENT_MODEL)) {
innerClient = new EventBasedKrbClient();
} else {
- innerClient = new InternalKrbClientImpl();
+ innerClient = new DefaultInternalKrbClient();
}
innerClient.init(commonOptions);
}
http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/8f312e5b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/KrbHandler.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/KrbHandler.java b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/KrbHandler.java
new file mode 100644
index 0000000..f65e855
--- /dev/null
+++ b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/KrbHandler.java
@@ -0,0 +1,82 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.kerby.kerberos.kerb.client;
+
+import org.apache.kerby.kerberos.kerb.KrbCodec;
+import org.apache.kerby.kerberos.kerb.KrbException;
+import org.apache.kerby.kerberos.kerb.client.preauth.PreauthHandler;
+import org.apache.kerby.kerberos.kerb.client.request.KdcRequest;
+import org.apache.kerby.kerberos.kerb.spec.base.KrbMessage;
+import org.apache.kerby.kerberos.kerb.spec.base.KrbMessageType;
+import org.apache.kerby.kerberos.kerb.spec.kdc.KdcRep;
+import org.apache.kerby.kerberos.kerb.spec.kdc.KdcReq;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+
+public abstract class KrbHandler {
+
+ private KrbContext context;
+ private PreauthHandler preauthHandler;
+
+ public void init(KrbContext context) {
+ this.context = context;
+ preauthHandler = new PreauthHandler();
+ preauthHandler.init(context);
+ }
+
+ public void handleRequest(KdcRequest kdcRequest) throws KrbException {
+ kdcRequest.process();
+ KdcReq kdcReq = kdcRequest.getKdcReq();
+
+ int bodyLen = kdcReq.encodingLength();
+ ByteBuffer requestMessage = ByteBuffer.allocate(bodyLen + 4);
+ requestMessage.putInt(bodyLen);
+ kdcReq.encode(requestMessage);
+ requestMessage.flip();
+
+ try {
+ sendMessage(kdcRequest, requestMessage);
+ } catch (IOException e) {
+ throw new KrbException("sending message failed", e);
+ }
+ }
+
+ public void onResponseMessage(
+ KdcRequest kdcRequest, ByteBuffer responseMessage) throws KrbException {
+
+ KrbMessage kdcRep = null;
+ try {
+ kdcRep = KrbCodec.decodeMessage(responseMessage);
+ } catch (IOException e) {
+ throw new KrbException("Krb decoding message failed", e);
+ }
+
+ KrbMessageType messageType = kdcRep.getMsgType();
+ if (messageType == KrbMessageType.AS_REP) {
+ kdcRequest.processResponse((KdcRep) kdcRep);
+ } else if (messageType == KrbMessageType.TGS_REP) {
+ kdcRequest.processResponse((KdcRep) kdcRep);
+ }
+ }
+
+ protected abstract void sendMessage(KdcRequest kdcRequest,
+ ByteBuffer requestMessage) throws IOException;
+}
http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/8f312e5b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/AbstractInternalKrbClient.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/AbstractInternalKrbClient.java b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/AbstractInternalKrbClient.java
index 97f498b..4356073 100644
--- a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/AbstractInternalKrbClient.java
+++ b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/AbstractInternalKrbClient.java
@@ -21,10 +21,7 @@ package org.apache.kerby.kerberos.kerb.client.impl;
import org.apache.kerby.KOptions;
import org.apache.kerby.kerberos.kerb.KrbException;
-import org.apache.kerby.kerberos.kerb.client.KrbConfig;
-import org.apache.kerby.kerberos.kerb.client.KrbContext;
-import org.apache.kerby.kerberos.kerb.client.KrbOption;
-import org.apache.kerby.kerberos.kerb.client.KrbSetting;
+import org.apache.kerby.kerberos.kerb.client.*;
import org.apache.kerby.kerberos.kerb.client.request.*;
import org.apache.kerby.kerberos.kerb.spec.base.AuthToken;
import org.apache.kerby.kerberos.kerb.spec.base.PrincipalName;
http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/8f312e5b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/DefaultInternalKrbClient.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/DefaultInternalKrbClient.java b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/DefaultInternalKrbClient.java
new file mode 100644
index 0000000..212cd82
--- /dev/null
+++ b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/DefaultInternalKrbClient.java
@@ -0,0 +1,83 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.kerby.kerberos.kerb.client.impl;
+
+import org.apache.kerby.KOptions;
+import org.apache.kerby.kerberos.kerb.KrbException;
+import org.apache.kerby.kerberos.kerb.client.request.AsRequest;
+import org.apache.kerby.kerberos.kerb.client.request.TgsRequest;
+import org.apache.kerby.kerberos.kerb.spec.ticket.ServiceTicket;
+import org.apache.kerby.kerberos.kerb.spec.ticket.TgtTicket;
+import org.apache.kerby.kerberos.kerb.transport.KrbNetwork;
+import org.apache.kerby.kerberos.kerb.transport.KrbTransport;
+
+import java.io.IOException;
+import java.net.InetSocketAddress;
+
+/**
+ * A default krb client implementation.
+ */
+public class DefaultInternalKrbClient extends AbstractInternalKrbClient {
+
+ private DefaultKrbHandler krbHandler;
+ private KrbTransport transport;
+
+ @Override
+ public void init(KOptions commonOptions) throws KrbException {
+ super.init(commonOptions);
+
+ this.krbHandler = new DefaultKrbHandler();
+ krbHandler.init(getContext());
+
+ InetSocketAddress tcpAddress, udpAddress = null;
+ tcpAddress= new InetSocketAddress(getSetting().getKdcHost(),
+ getSetting().getKdcTcpPort());
+ if (getSetting().allowUdp()) {
+ udpAddress = new InetSocketAddress(getSetting().getKdcHost(),
+ getSetting().getKdcUdpPort());
+ }
+
+ KrbNetwork network = new KrbNetwork();
+ try {
+ transport = network.connect(tcpAddress, udpAddress);
+ } catch (IOException e) {
+ throw new KrbException("Failed to create transport", e);
+ }
+ }
+
+ @Override
+ protected TgtTicket doRequestTgtTicket(AsRequest tgtTktReq) throws KrbException {
+ tgtTktReq.setSessionData(transport);
+
+ krbHandler.handleRequest(tgtTktReq);
+
+ return tgtTktReq.getTicket();
+ }
+
+ @Override
+ protected ServiceTicket doRequestServiceTicket(TgsRequest ticketReq) throws KrbException {
+ ticketReq.setSessionData(transport);
+
+ krbHandler.handleRequest(ticketReq);
+
+ return ticketReq.getServiceTicket();
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/8f312e5b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/DefaultKrbHandler.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/DefaultKrbHandler.java b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/DefaultKrbHandler.java
new file mode 100644
index 0000000..ee80372
--- /dev/null
+++ b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/DefaultKrbHandler.java
@@ -0,0 +1,58 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.kerby.kerberos.kerb.client.impl;
+
+import org.apache.kerby.kerberos.kerb.KrbException;
+import org.apache.kerby.kerberos.kerb.client.KrbContext;
+import org.apache.kerby.kerberos.kerb.client.KrbHandler;
+import org.apache.kerby.kerberos.kerb.client.request.KdcRequest;
+import org.apache.kerby.kerberos.kerb.transport.KrbTransport;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+
+public class DefaultKrbHandler extends KrbHandler {
+
+ public void init(KrbContext context) {
+ super.init(context);
+ }
+
+ @Override
+ public void handleRequest(KdcRequest kdcRequest) throws KrbException {
+ KrbTransport transport = (KrbTransport) kdcRequest.getSessionData();
+ transport.setAttachment(kdcRequest);
+
+ super.handleRequest(kdcRequest);
+ ByteBuffer receivedMessage = null;
+ try {
+ receivedMessage = transport.receiveMessage();
+ } catch (IOException e) {
+ throw new KrbException("Receiving response message failed", e);
+ }
+ super.onResponseMessage(kdcRequest, receivedMessage);
+ }
+
+ @Override
+ protected void sendMessage(KdcRequest kdcRequest,
+ ByteBuffer requestMessage) throws IOException {
+ KrbTransport transport = (KrbTransport) kdcRequest.getSessionData();
+ transport.sendMessage(requestMessage);
+ }
+}
http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/8f312e5b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/InternalKrbClient.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/InternalKrbClient.java b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/InternalKrbClient.java
deleted file mode 100644
index 4dcf50e..0000000
--- a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/InternalKrbClient.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.kerby.kerberos.kerb.client.impl;
-
-import org.apache.kerby.kerberos.kerb.KrbException;
-import org.apache.kerby.KOptions;
-import org.apache.kerby.kerberos.kerb.client.KrbSetting;
-import org.apache.kerby.kerberos.kerb.spec.base.AuthToken;
-import org.apache.kerby.kerberos.kerb.spec.ticket.ServiceTicket;
-import org.apache.kerby.kerberos.kerb.spec.ticket.TgtTicket;
-
-/**
- * An internal krb client interface.
- */
-public interface InternalKrbClient {
-
- /**
- * Init with all the necessary options.
- * @param options
- */
- public void init(KOptions options) throws KrbException;
-
- /**
- * Get krb client settings.
- * @return setting
- */
- public KrbSetting getSetting();
-
- /**
- * Request a Ticket Granting Ticket.
- * @param requestOptions
- * @return a TGT
- * @throws KrbException
- */
- public TgtTicket requestTgtTicket(KOptions requestOptions) throws KrbException;
-
- /**
- * Request a service ticket using a TGT.
- * @return service ticket
- * @throws KrbException
- */
- public ServiceTicket requestServiceTicketWithTgt(TgtTicket tgt,
- String serverPrincipal) throws KrbException;
-
- /**
- * Request a service ticket using an Access Token.
- * @return service ticket
- * @throws KrbException
- */
- public ServiceTicket requestServiceTicketWithAccessToken(AuthToken token,
- String serverPrincipal) throws KrbException;
-}
http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/8f312e5b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/InternalKrbClientImpl.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/InternalKrbClientImpl.java b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/InternalKrbClientImpl.java
deleted file mode 100644
index 0ecb7b3..0000000
--- a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/InternalKrbClientImpl.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.kerby.kerberos.kerb.client.impl;
-
-import org.apache.kerby.KOptions;
-import org.apache.kerby.kerberos.kerb.KrbException;
-import org.apache.kerby.kerberos.kerb.client.request.AsRequest;
-import org.apache.kerby.kerberos.kerb.client.request.TgsRequest;
-import org.apache.kerby.kerberos.kerb.spec.ticket.ServiceTicket;
-import org.apache.kerby.kerberos.kerb.spec.ticket.TgtTicket;
-import org.apache.kerby.kerberos.kerb.transport.KrbNetwork;
-import org.apache.kerby.kerberos.kerb.transport.KrbTransport;
-
-import java.io.IOException;
-import java.net.InetSocketAddress;
-
-/**
- * A default krb client implementation.
- */
-public class InternalKrbClientImpl extends AbstractInternalKrbClient {
-
- private KrbHandler krbHandler;
- private KrbTransport transport;
-
- @Override
- public void init(KOptions commonOptions) throws KrbException {
- super.init(commonOptions);
-
- this.krbHandler = new KrbHandler();
- krbHandler.init(getContext());
-
- InetSocketAddress tcpAddress, udpAddress = null;
- tcpAddress= new InetSocketAddress(getSetting().getKdcHost(),
- getSetting().getKdcTcpPort());
- if (getSetting().allowUdp()) {
- udpAddress = new InetSocketAddress(getSetting().getKdcHost(),
- getSetting().getKdcUdpPort());
- }
-
- KrbNetwork network = new KrbNetwork();
- try {
- transport = network.connect(tcpAddress, udpAddress);
- } catch (IOException e) {
- throw new KrbException("Failed to create transport", e);
- }
- }
-
- @Override
- protected TgtTicket doRequestTgtTicket(AsRequest tgtTktReq) throws KrbException {
- tgtTktReq.setTransport(transport);
-
- krbHandler.handleRequest(tgtTktReq);
-
- return tgtTktReq.getTicket();
- }
-
- @Override
- protected ServiceTicket doRequestServiceTicket(TgsRequest ticketReq) throws KrbException {
- ticketReq.setTransport(transport);
-
- krbHandler.handleRequest(ticketReq);
-
- return ticketReq.getServiceTicket();
- }
-
-}
http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/8f312e5b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/KrbHandler.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/KrbHandler.java b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/KrbHandler.java
deleted file mode 100644
index 83df9a4..0000000
--- a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/KrbHandler.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.kerby.kerberos.kerb.client.impl;
-
-import org.apache.kerby.kerberos.kerb.KrbException;
-import org.apache.kerby.kerberos.kerb.client.KrbContext;
-import org.apache.kerby.kerberos.kerb.client.preauth.PreauthHandler;
-import org.apache.kerby.kerberos.kerb.client.request.KdcRequest;
-import org.apache.kerby.kerberos.kerb.common.KrbUtil;
-import org.apache.kerby.kerberos.kerb.spec.base.KrbMessage;
-import org.apache.kerby.kerberos.kerb.spec.base.KrbMessageType;
-import org.apache.kerby.kerberos.kerb.spec.kdc.KdcRep;
-import org.apache.kerby.kerberos.kerb.spec.kdc.KdcReq;
-import org.apache.kerby.kerberos.kerb.transport.KrbTransport;
-
-import java.io.IOException;
-import java.nio.ByteBuffer;
-
-public class KrbHandler {
-
- private PreauthHandler preauthHandler;
-
- public void init(KrbContext context) {
- preauthHandler = new PreauthHandler();
- preauthHandler.init(context);
- }
-
- public void handleRequest(KdcRequest kdcRequest) throws KrbException {
- kdcRequest.process();
- KdcReq kdcReq = kdcRequest.getKdcReq();
- KrbTransport transport = kdcRequest.getTransport();
- transport.setAttachment(kdcRequest);
- KrbMessage kdcRep = null;
-
- try {
- KrbUtil.sendMessage(kdcReq, transport);
-
- ByteBuffer message = transport.receiveMessage();
- if (message != null) {
- kdcRep = KrbUtil.decodeMessage(message);
- } else {
- throw new KrbException("No valid response recved");
- }
- } catch (IOException e) {
- throw new KrbException("Transport or decoding error occurred", e);
- }
-
- KrbMessageType messageType = kdcRep.getMsgType();
- if (messageType == KrbMessageType.AS_REP) {
- kdcRequest.processResponse((KdcRep) kdcRep);
- } else if (messageType == KrbMessageType.TGS_REP) {
- kdcRequest.processResponse((KdcRep) kdcRep);
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/8f312e5b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/event/EventBasedKrbClient.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/event/EventBasedKrbClient.java b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/event/EventBasedKrbClient.java
index f1a86e8..525dfb6 100644
--- a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/event/EventBasedKrbClient.java
+++ b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/event/EventBasedKrbClient.java
@@ -30,15 +30,11 @@ import org.apache.kerby.kerberos.kerb.client.request.TgsRequest;
import org.apache.kerby.kerberos.kerb.common.KrbStreamingDecoder;
import org.apache.kerby.kerberos.kerb.spec.ticket.ServiceTicket;
import org.apache.kerby.kerberos.kerb.spec.ticket.TgtTicket;
-import org.apache.kerby.kerberos.kerb.transport.KrbTransport;
import org.apache.kerby.transport.Network;
import org.apache.kerby.transport.Transport;
import org.apache.kerby.transport.event.TransportEvent;
import org.apache.kerby.transport.event.TransportEventType;
-import java.io.IOException;
-import java.net.InetAddress;
-import java.nio.ByteBuffer;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
@@ -50,8 +46,7 @@ public class EventBasedKrbClient extends AbstractInternalKrbClient {
private EventKrbHandler krbHandler;
private EventHub eventHub;
private EventWaiter eventWaiter;
- private Transport eventTransport;
- private KrbTransport transport;
+ private Transport transport;
@Override
public void init(KOptions commonOptions) throws KrbException {
@@ -82,44 +77,13 @@ public class EventBasedKrbClient extends AbstractInternalKrbClient {
getSetting().getKdcUdpPort());
}
final Event event = eventWaiter.waitEvent(TransportEventType.NEW_TRANSPORT);
- eventTransport = ((TransportEvent) event).getTransport();
-
- transport = new KrbTransport() {
- @Override
- public void sendMessage(ByteBuffer message) throws IOException {
- eventTransport.sendMessage(message);
- }
-
- @Override
- public ByteBuffer receiveMessage() throws IOException {
- return null; // NOOP, should not be here, since event based.
- }
-
- @Override
- public InetAddress getRemoteAddress() {
- return eventTransport.getRemoteAddress().getAddress();
- }
-
- @Override
- public void setAttachment(Object attachment) {
- eventTransport.setAttachment(attachment);
- }
-
- @Override
- public Object getAttachment() {
- return eventTransport.getAttachment();
- }
-
- @Override
- public void release() throws IOException {
-
- }
- };
+ transport = ((TransportEvent) event).getTransport();
}
@Override
protected TgtTicket doRequestTgtTicket(AsRequest tgtTktReq) throws KrbException {
- tgtTktReq.setTransport(transport);
+ tgtTktReq.setSessionData(transport);
+ transport.setAttachment(tgtTktReq);
eventHub.dispatch(KrbClientEvent.createTgtIntentEvent(tgtTktReq));
Event resultEvent;
@@ -136,7 +100,8 @@ public class EventBasedKrbClient extends AbstractInternalKrbClient {
@Override
protected ServiceTicket doRequestServiceTicket(TgsRequest ticketReq) throws KrbException {
- ticketReq.setTransport(transport);
+ ticketReq.setSessionData(transport);
+ transport.setAttachment(ticketReq);
eventHub.dispatch(KrbClientEvent.createTktIntentEvent(ticketReq));
Event resultEvent;
@@ -150,5 +115,4 @@ public class EventBasedKrbClient extends AbstractInternalKrbClient {
return tgsResponse.getServiceTicket();
}
-
}
http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/8f312e5b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/event/EventKrbHandler.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/event/EventKrbHandler.java b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/event/EventKrbHandler.java
index f7c7642..e2a6dbd 100644
--- a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/event/EventKrbHandler.java
+++ b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/event/EventKrbHandler.java
@@ -23,30 +23,32 @@ import org.apache.kerby.event.AbstractEventHandler;
import org.apache.kerby.event.Event;
import org.apache.kerby.event.EventType;
import org.apache.kerby.kerberos.kerb.client.KrbContext;
-import org.apache.kerby.kerberos.kerb.client.preauth.PreauthHandler;
+import org.apache.kerby.kerberos.kerb.client.KrbHandler;
import org.apache.kerby.kerberos.kerb.client.request.AsRequest;
import org.apache.kerby.kerberos.kerb.client.request.KdcRequest;
import org.apache.kerby.kerberos.kerb.client.request.TgsRequest;
-import org.apache.kerby.kerberos.kerb.common.KrbUtil;
-import org.apache.kerby.kerberos.kerb.spec.base.KrbMessage;
-import org.apache.kerby.kerberos.kerb.spec.base.KrbMessageType;
-import org.apache.kerby.kerberos.kerb.spec.kdc.KdcRep;
-import org.apache.kerby.kerberos.kerb.spec.kdc.KdcReq;
-import org.apache.kerby.kerberos.kerb.transport.KrbTransport;
+import org.apache.kerby.transport.Transport;
import org.apache.kerby.transport.event.MessageEvent;
import org.apache.kerby.transport.event.TransportEventType;
+import java.io.IOException;
import java.nio.ByteBuffer;
public class EventKrbHandler extends AbstractEventHandler {
- private KrbContext context;
- private PreauthHandler preauthHandler;
+ private KrbHandler innerHandler;
+
public void init(KrbContext context) {
- this.context = context;
- preauthHandler = new PreauthHandler();
- preauthHandler.init(context);
+ this.innerHandler = new KrbHandler() {
+ @Override
+ protected void sendMessage(KdcRequest kdcRequest,
+ ByteBuffer requestMessage) throws IOException {
+ Transport transport = (Transport) kdcRequest.getSessionData();
+ transport.sendMessage(requestMessage);
+ }
+ };
+ innerHandler.init(context);
}
@Override
@@ -65,32 +67,20 @@ public class EventKrbHandler extends AbstractEventHandler {
if (eventType == KrbClientEventType.TGT_INTENT ||
eventType == KrbClientEventType.TKT_INTENT) {
KdcRequest kdcRequest = (KdcRequest) event.getEventData();
- handleKdcRequest(kdcRequest);
+ innerHandler.handleRequest(kdcRequest);
} else if (event.getEventType() == TransportEventType.INBOUND_MESSAGE) {
handleMessage((MessageEvent) event);
}
}
- protected void handleKdcRequest(KdcRequest kdcRequest) throws Exception {
- kdcRequest.process();
- KdcReq kdcReq = kdcRequest.getKdcReq();
- KrbTransport transport = kdcRequest.getTransport();
- transport.setAttachment(kdcRequest);
- KrbUtil.sendMessage(kdcReq, transport);
- }
-
protected void handleMessage(MessageEvent event) throws Exception {
- ByteBuffer message = event.getMessage();
- KrbMessage kdcRep = KrbUtil.decodeMessageOld(message);
+ ByteBuffer receivedMessage = event.getMessage();
- KrbMessageType messageType = kdcRep.getMsgType();
- if (messageType == KrbMessageType.AS_REP) {
- KdcRequest kdcRequest = (KdcRequest) event.getTransport().getAttachment();
- kdcRequest.processResponse((KdcRep) kdcRep);
+ KdcRequest kdcRequest = (KdcRequest) event.getTransport().getAttachment();
+ innerHandler.onResponseMessage(kdcRequest, receivedMessage);
+ if (AsRequest.class.isAssignableFrom(kdcRequest.getClass())) {
dispatch(KrbClientEvent.createTgtResultEvent((AsRequest) kdcRequest));
- } else if (messageType == KrbMessageType.TGS_REP) {
- KdcRequest kdcRequest = (KdcRequest) event.getTransport().getAttachment();
- kdcRequest.processResponse((KdcRep) kdcRep);
+ } else if (TgsRequest.class.isAssignableFrom(kdcRequest.getClass())) {
dispatch(KrbClientEvent.createTktResultEvent((TgsRequest) kdcRequest));
}
}
http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/8f312e5b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/request/KdcRequest.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/request/KdcRequest.java b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/request/KdcRequest.java
index 1a5570d..8cf328b 100644
--- a/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/request/KdcRequest.java
+++ b/kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/request/KdcRequest.java
@@ -33,7 +33,6 @@ import org.apache.kerby.kerberos.kerb.spec.kdc.KdcRep;
import org.apache.kerby.kerberos.kerb.spec.kdc.KdcReq;
import org.apache.kerby.kerberos.kerb.spec.kdc.KdcReqBody;
import org.apache.kerby.kerberos.kerb.spec.pa.PaDataType;
-import org.apache.kerby.kerberos.kerb.transport.KrbTransport;
import java.net.InetAddress;
import java.net.UnknownHostException;
@@ -47,7 +46,7 @@ import java.util.Map;
*/
public abstract class KdcRequest {
private KrbContext context;
- private KrbTransport transport;
+ private Object sessionData;
private KOptions krbOptions;
private PrincipalName serverPrincipal;
@@ -75,12 +74,12 @@ public abstract class KdcRequest {
this.fastContext = new KrbFastContext();
}
- public void setTransport(KrbTransport transport) {
- this.transport = transport;
+ public void setSessionData(Object sessionData) {
+ this.sessionData = sessionData;
}
- public KrbTransport getTransport() {
- return this.transport;
+ public Object getSessionData() {
+ return this.sessionData;
}
public void setKrbOptions(KOptions options) {
http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/8f312e5b/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/common/KrbStreamingDecoder.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/common/KrbStreamingDecoder.java b/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/common/KrbStreamingDecoder.java
index 82015ee..a647bf0 100644
--- a/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/common/KrbStreamingDecoder.java
+++ b/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/common/KrbStreamingDecoder.java
@@ -31,7 +31,7 @@ public class KrbStreamingDecoder implements StreamingDecoder {
if (streamingBuffer.remaining() >= 4) {
int len = streamingBuffer.getInt();
if (streamingBuffer.remaining() >= len) {
- callback.onMessageComplete(len + 4);
+ callback.onMessageComplete(len + 4, 4); //Remove the prefix length
} else {
callback.onMoreDataNeeded(len + 4);
}
http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/8f312e5b/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/common/KrbUtil.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/common/KrbUtil.java b/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/common/KrbUtil.java
deleted file mode 100644
index ad461ba..0000000
--- a/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/common/KrbUtil.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-package org.apache.kerby.kerberos.kerb.common;
-
-import org.apache.kerby.kerberos.kerb.KrbCodec;
-import org.apache.kerby.kerberos.kerb.spec.base.KrbMessage;
-import org.apache.kerby.kerberos.kerb.transport.KrbTransport;
-import org.apache.kerby.transport.Transport;
-
-import java.io.IOException;
-import java.nio.ByteBuffer;
-
-public class KrbUtil {
-
- public static void sendMessage(KrbMessage message,
- KrbTransport transport) throws IOException {
- int bodyLen = message.encodingLength();
- ByteBuffer buffer = ByteBuffer.allocate(bodyLen + 4);
- buffer.putInt(bodyLen);
- message.encode(buffer);
- buffer.flip();
- transport.sendMessage(buffer);
- }
-
- /**
- * To be cleaned up
- * @param message
- * @param transport
- * @throws IOException
- */
- public static void sendMessageOld(KrbMessage message,
- Transport transport) throws IOException {
- int bodyLen = message.encodingLength();
- ByteBuffer buffer = ByteBuffer.allocate(bodyLen + 4);
- buffer.putInt(bodyLen);
- message.encode(buffer);
- buffer.flip();
- transport.sendMessage(buffer);
- }
-
- /**
- * To be cleaned.
- * @param message
- * @return
- * @throws IOException
- */
- public static KrbMessage decodeMessageOld(ByteBuffer message) throws IOException {
- int bodyLen = message.getInt();
- assert (message.remaining() >= bodyLen);
-
- KrbMessage krbMessage = KrbCodec.decodeMessage(message);
-
- return krbMessage;
- }
-
- public static KrbMessage decodeMessage(ByteBuffer message) throws IOException {
- KrbMessage krbMessage = KrbCodec.decodeMessage(message);
-
- return krbMessage;
- }
-
-}
http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/8f312e5b/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/transport/KrbTcpTransport.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/transport/KrbTcpTransport.java b/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/transport/KrbTcpTransport.java
index 7760965..610a63d 100644
--- a/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/transport/KrbTcpTransport.java
+++ b/kerby-kerb/kerb-common/src/main/java/org/apache/kerby/kerberos/kerb/transport/KrbTcpTransport.java
@@ -50,16 +50,11 @@ public class KrbTcpTransport
}
@Override
- public ByteBuffer receiveMessage() {
- try {
- int msgLen = inputStream.readInt();
- if (msgLen > 0) {
- inputStream.readFully(messageBuffer, 0, msgLen);
- return ByteBuffer.wrap(messageBuffer, 0, msgLen);
- }
- } catch (IOException e) {
- //e.printStackTrace();
- return null;
+ public ByteBuffer receiveMessage() throws IOException {
+ int msgLen = inputStream.readInt();
+ if (msgLen > 0) {
+ inputStream.readFully(messageBuffer, 0, msgLen);
+ return ByteBuffer.wrap(messageBuffer, 0, msgLen);
}
return null;
http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/8f312e5b/kerby-kerb/kerb-kdc-test/src/main/java/org/apache/kerby/kerberos/kerb/server/KdcTestBase.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-kdc-test/src/main/java/org/apache/kerby/kerberos/kerb/server/KdcTestBase.java b/kerby-kerb/kerb-kdc-test/src/main/java/org/apache/kerby/kerberos/kerb/server/KdcTestBase.java
index b0e0214..8f38b0e 100644
--- a/kerby-kerb/kerb-kdc-test/src/main/java/org/apache/kerby/kerberos/kerb/server/KdcTestBase.java
+++ b/kerby-kerb/kerb-kdc-test/src/main/java/org/apache/kerby/kerberos/kerb/server/KdcTestBase.java
@@ -52,13 +52,23 @@ public abstract class KdcTestBase {
udpPort = getServerPort();
}
- setUpKkdcServer();
+ setUpKdcServer();
setUpClient();
createPrincipals();
}
/**
+ * Prepare KrbClient startup options and config.
+ * @throws Exception
+ */
+ protected void prepareKrbClient() throws Exception {
+ if (useEventModelClient()) {
+ krbClnt.useEventModel();
+ }
+ }
+
+ /**
* Prepare KDC startup options and config.
* @throws Exception
*/
@@ -67,13 +77,26 @@ public abstract class KdcTestBase {
if (tcpPort > 0) {
kdcServer.setKdcTcpPort(tcpPort);
}
+
kdcServer.setAllowUdp(allowUdp());
if (udpPort > 0) {
kdcServer.setKdcUdpPort(udpPort);
}
+
+ if (useEventModelKdc()) {
+ kdcServer.useEventModel();
+ }
+ }
+
+ protected boolean useEventModelKdc() {
+ return false;
+ }
+
+ protected boolean useEventModelClient() {
+ return false;
}
- protected void setUpKkdcServer() throws Exception {
+ protected void setUpKdcServer() throws Exception {
kdcServer = new TestKdcServer();
prepareKdcServer();
kdcServer.init();
@@ -85,6 +108,7 @@ public abstract class KdcTestBase {
protected void setUpClient() throws Exception {
krbClnt = new KrbClient();
+ prepareKrbClient();
krbClnt.setKdcHost(hostname);
if (tcpPort > 0) {
http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/8f312e5b/kerby-kerb/kerb-kdc-test/src/test/java/org/apache/kerby/kerberos/kerb/server/KdcTestUsingEventClient.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-kdc-test/src/test/java/org/apache/kerby/kerberos/kerb/server/KdcTestUsingEventClient.java b/kerby-kerb/kerb-kdc-test/src/test/java/org/apache/kerby/kerberos/kerb/server/KdcTestUsingEventClient.java
new file mode 100644
index 0000000..5e906de
--- /dev/null
+++ b/kerby-kerb/kerb-kdc-test/src/test/java/org/apache/kerby/kerberos/kerb/server/KdcTestUsingEventClient.java
@@ -0,0 +1,35 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.kerby.kerberos.kerb.server;
+
+import org.junit.Test;
+
+public class KdcTestUsingEventClient extends KdcTest {
+
+ @Override
+ protected boolean useEventModelClient() {
+ return false;
+ }
+
+ @Test
+ public void testKdc() throws Exception {
+ performKdcTest();
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/8f312e5b/kerby-kerb/kerb-kdc-test/src/test/java/org/apache/kerby/kerberos/kerb/server/KdcTestUsingEventKdc.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-kdc-test/src/test/java/org/apache/kerby/kerberos/kerb/server/KdcTestUsingEventKdc.java b/kerby-kerb/kerb-kdc-test/src/test/java/org/apache/kerby/kerberos/kerb/server/KdcTestUsingEventKdc.java
new file mode 100644
index 0000000..99a1aad
--- /dev/null
+++ b/kerby-kerb/kerb-kdc-test/src/test/java/org/apache/kerby/kerberos/kerb/server/KdcTestUsingEventKdc.java
@@ -0,0 +1,35 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.kerby.kerberos.kerb.server;
+
+import org.junit.Test;
+
+public class KdcTestUsingEventKdc extends KdcTest {
+
+ @Override
+ protected boolean useEventModelKdc() {
+ return false;
+ }
+
+ @Test
+ public void testKdc() throws Exception {
+ performKdcTest();
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/8f312e5b/kerby-kerb/kerb-server/src/main/java/org/apache/kerby/kerberos/kerb/server/KdcHandler.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-server/src/main/java/org/apache/kerby/kerberos/kerb/server/KdcHandler.java b/kerby-kerb/kerb-server/src/main/java/org/apache/kerby/kerberos/kerb/server/KdcHandler.java
index 95ec7f0..909b232 100644
--- a/kerby-kerb/kerb-server/src/main/java/org/apache/kerby/kerberos/kerb/server/KdcHandler.java
+++ b/kerby-kerb/kerb-server/src/main/java/org/apache/kerby/kerberos/kerb/server/KdcHandler.java
@@ -19,8 +19,8 @@
*/
package org.apache.kerby.kerberos.kerb.server;
+import org.apache.kerby.kerberos.kerb.KrbCodec;
import org.apache.kerby.kerberos.kerb.KrbException;
-import org.apache.kerby.kerberos.kerb.common.KrbUtil;
import org.apache.kerby.kerberos.kerb.server.request.AsRequest;
import org.apache.kerby.kerberos.kerb.server.request.KdcRequest;
import org.apache.kerby.kerberos.kerb.server.request.TgsRequest;
@@ -30,6 +30,7 @@ import org.apache.kerby.kerberos.kerb.spec.kdc.AsReq;
import org.apache.kerby.kerberos.kerb.spec.kdc.KdcReq;
import org.apache.kerby.kerberos.kerb.spec.kdc.TgsReq;
+import java.io.IOException;
import java.net.InetAddress;
import java.nio.ByteBuffer;
@@ -43,9 +44,15 @@ public class KdcHandler {
this.kdcContext = kdcContext;
}
- public ByteBuffer handleMessage(ByteBuffer message, boolean isTcp,
- InetAddress remoteAddress) throws Exception {
- KrbMessage krbRequest = KrbUtil.decodeMessage(message);
+ public ByteBuffer handleMessage(ByteBuffer receivedMessage, boolean isTcp,
+ InetAddress remoteAddress) throws KrbException {
+ KrbMessage krbRequest = null;
+ try {
+ krbRequest = KrbCodec.decodeMessage(receivedMessage);
+ } catch (IOException e) {
+ throw new KrbException("Krb decoding message failed", e);
+ }
+
KdcRequest kdcRequest = null;
KrbMessageType messageType = krbRequest.getMsgType();
http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/8f312e5b/kerby-kerb/kerb-server/src/main/java/org/apache/kerby/kerberos/kerb/server/KdcServer.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-server/src/main/java/org/apache/kerby/kerberos/kerb/server/KdcServer.java b/kerby-kerb/kerb-server/src/main/java/org/apache/kerby/kerberos/kerb/server/KdcServer.java
index ff3e22e..5161b23 100644
--- a/kerby-kerb/kerb-server/src/main/java/org/apache/kerby/kerberos/kerb/server/KdcServer.java
+++ b/kerby-kerb/kerb-server/src/main/java/org/apache/kerby/kerberos/kerb/server/KdcServer.java
@@ -21,7 +21,7 @@ package org.apache.kerby.kerberos.kerb.server;
import org.apache.kerby.KOptions;
import org.apache.kerby.kerberos.kerb.identity.IdentityService;
-import org.apache.kerby.kerberos.kerb.server.impl.DefaultInternalKdcServerImpl;
+import org.apache.kerby.kerberos.kerb.server.impl.DefaultInternalKdcServer;
import org.apache.kerby.kerberos.kerb.server.impl.event.EventBasedKdcServer;
import java.io.File;
@@ -169,7 +169,7 @@ public class KdcServer {
} else if (commonOptions.contains(KdcServerOption.USE_EVENT_MODEL)) {
innerKdc = new EventBasedKdcServer();
} else {
- innerKdc = new DefaultInternalKdcServerImpl();
+ innerKdc = new DefaultInternalKdcServer();
}
innerKdc.init(commonOptions);
}
http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/8f312e5b/kerby-kerb/kerb-server/src/main/java/org/apache/kerby/kerberos/kerb/server/impl/DefaultInternalKdcServer.java
----------------------------------------------------------------------
diff --git a/kerby-kerb/kerb-server/src/main/java/org/apache/kerby/kerberos/kerb/server/impl/DefaultInternalKdcServer.java b/kerby-kerb/kerb-server/src/main/java/org/apache/kerby/kerberos/kerb/server/impl/DefaultInternalKdcServer.java
new file mode 100644
index 0000000..a4561c3
--- /dev/null
+++ b/kerby-kerb/kerb-server/src/main/java/org/apache/kerby/kerberos/kerb/server/impl/DefaultInternalKdcServer.java
@@ -0,0 +1,84 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.kerby.kerberos.kerb.server.impl;
+
+import org.apache.kerby.kerberos.kerb.server.KdcContext;
+import org.apache.kerby.kerberos.kerb.server.preauth.PreauthHandler;
+import org.apache.kerby.kerberos.kerb.transport.KdcNetwork;
+import org.apache.kerby.kerberos.kerb.transport.KrbTransport;
+
+import java.net.InetSocketAddress;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+/**
+ * A default KDC server implementation.
+ */
+public class DefaultInternalKdcServer extends AbstractInternalKdcServer {
+ private ExecutorService executor;
+ private KdcContext kdcContext;
+ private KdcNetwork network;
+
+ @Override
+ protected void doStart() throws Exception {
+ super.doStart();
+
+ prepareHandler();
+
+ executor = Executors.newCachedThreadPool();
+
+ network = new KdcNetwork() {
+ @Override
+ protected void onNewTransport(KrbTransport transport) {
+ DefaultKdcHandler kdcHandler = new DefaultKdcHandler(kdcContext, transport);
+ executor.execute(kdcHandler);
+ }
+ };
+
+ network.init();
+
+ InetSocketAddress tcpAddress, udpAddress = null;
+ tcpAddress = new InetSocketAddress(getSetting().getKdcHost(),
+ getSetting().getKdcTcpPort());
+ if (getSetting().allowUdp()) {
+ udpAddress = new InetSocketAddress(getSetting().getKdcHost(),
+ getSetting().getKdcUdpPort());
+ }
+ network.listen(tcpAddress, udpAddress);
+ network.start();
+ }
+
+ private void prepareHandler() {
+ kdcContext = new KdcContext(getSetting());
+ kdcContext.setIdentityService(getBackend());
+ PreauthHandler preauthHandler = new PreauthHandler();
+ preauthHandler.init(kdcContext.getConfig());
+ kdcContext.setPreauthHandler(preauthHandler);
+ }
+
+ @Override
+ protected void doStop() throws Exception {
+ super.doStop();
+
+ network.stop();
+
+ executor.shutdownNow();
+ }
+}
http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/8f312e5b/lib/kerby-event/src/main/java/org/apache/kerby/transport/tcp/DecodingCallback.java
----------------------------------------------------------------------
diff --git a/lib/kerby-event/src/main/java/org/apache/kerby/transport/tcp/DecodingCallback.java b/lib/kerby-event/src/main/java/org/apache/kerby/transport/tcp/DecodingCallback.java
index 8b8c352..4dd179a 100644
--- a/lib/kerby-event/src/main/java/org/apache/kerby/transport/tcp/DecodingCallback.java
+++ b/lib/kerby-event/src/main/java/org/apache/kerby/transport/tcp/DecodingCallback.java
@@ -24,7 +24,7 @@ public interface DecodingCallback {
/**
* OK, enough data is ready, a message can be out
*/
- public void onMessageComplete(int messageLength);
+ public void onMessageComplete(int messageLength, int adjustOffset);
/**
* Need more data to be available
http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/8f312e5b/lib/kerby-event/src/main/java/org/apache/kerby/transport/tcp/TcpTransport.java
----------------------------------------------------------------------
diff --git a/lib/kerby-event/src/main/java/org/apache/kerby/transport/tcp/TcpTransport.java b/lib/kerby-event/src/main/java/org/apache/kerby/transport/tcp/TcpTransport.java
index c09d393..57705ca 100644
--- a/lib/kerby-event/src/main/java/org/apache/kerby/transport/tcp/TcpTransport.java
+++ b/lib/kerby-event/src/main/java/org/apache/kerby/transport/tcp/TcpTransport.java
@@ -69,7 +69,7 @@ public class TcpTransport extends Transport {
private ByteBuffer streamingBuffer;
@Override
- public void onMessageComplete(int messageLength) {
+ public void onMessageComplete(int messageLength, int adjustOffset) {
ByteBuffer message = null;
int remaining = streamingBuffer.remaining();
@@ -85,7 +85,11 @@ public class TcpTransport extends Transport {
}
if (message != null) {
- dispatcher.dispatch(MessageEvent.createInboundMessageEvent(TcpTransport.this, message));
+ if (adjustOffset > 0) {
+ message.position(message.position() + adjustOffset);
+ }
+ dispatcher.dispatch(MessageEvent.createInboundMessageEvent(
+ TcpTransport.this, message));
}
}
http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/8f312e5b/lib/kerby-event/src/test/java/org/apache/kerby/event/network/TestNetworkBase.java
----------------------------------------------------------------------
diff --git a/lib/kerby-event/src/test/java/org/apache/kerby/event/network/TestNetworkBase.java b/lib/kerby-event/src/test/java/org/apache/kerby/event/network/TestNetworkBase.java
index 9a0562c..2ef7241 100644
--- a/lib/kerby-event/src/test/java/org/apache/kerby/event/network/TestNetworkBase.java
+++ b/lib/kerby-event/src/test/java/org/apache/kerby/event/network/TestNetworkBase.java
@@ -54,7 +54,7 @@ public class TestNetworkBase {
public void decode(ByteBuffer streamingBuffer, DecodingCallback callback) {
int expectedMessageLength = TEST_MESSAGE.getBytes().length;
if (streamingBuffer.remaining() >= expectedMessageLength) {
- callback.onMessageComplete(expectedMessageLength);
+ callback.onMessageComplete(expectedMessageLength, -1);
} else {
callback.onMoreDataNeeded(expectedMessageLength);
}
http://git-wip-us.apache.org/repos/asf/directory-kerby/blob/8f312e5b/lib/kerby-event/src/test/java/org/apache/kerby/event/tcp/TestTcpBase.java
----------------------------------------------------------------------
diff --git a/lib/kerby-event/src/test/java/org/apache/kerby/event/tcp/TestTcpBase.java b/lib/kerby-event/src/test/java/org/apache/kerby/event/tcp/TestTcpBase.java
index c4c2d55..ed060ef 100644
--- a/lib/kerby-event/src/test/java/org/apache/kerby/event/tcp/TestTcpBase.java
+++ b/lib/kerby-event/src/test/java/org/apache/kerby/event/tcp/TestTcpBase.java
@@ -52,7 +52,7 @@ public class TestTcpBase {
public void decode(ByteBuffer streamingBuffer, DecodingCallback callback) {
int expectedMessageLength = TEST_MESSAGE.getBytes().length;
if (streamingBuffer.remaining() >= expectedMessageLength) {
- callback.onMessageComplete(expectedMessageLength);
+ callback.onMessageComplete(expectedMessageLength, -1);
} else {
callback.onMoreDataNeeded(expectedMessageLength);
}