package org.apache.kerberos.kerb.client; import org.apache.haox.event.AbstractEventHandler; import org.apache.haox.event.Event; import org.apache.haox.event.EventType; import org.apache.kerberos.kerb.client.event.KrbClientEvent; import org.apache.kerberos.kerb.client.event.KrbClientEventType; import org.apache.kerberos.kerb.client.preauth.PreauthHandler; import org.apache.kerberos.kerb.client.request.AsRequest; import org.apache.kerberos.kerb.client.request.KdcRequest; import org.apache.kerberos.kerb.client.request.TgsRequest; import org.apache.kerberos.kerb.common.KrbUtil; 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.KdcRep; import org.apache.kerberos.kerb.spec.kdc.KdcReq; import org.apache.haox.transport.Transport; import org.apache.haox.transport.event.MessageEvent; import org.apache.haox.transport.event.TransportEventType; import java.nio.ByteBuffer; public class KrbHandler extends AbstractEventHandler { private KrbContext context; private PreauthHandler preauthHandler; public void init(KrbContext context) { this.context = context; preauthHandler = new PreauthHandler(); preauthHandler.init(context); } @Override public EventType[] getInterestedEvents() { return new EventType[] { TransportEventType.INBOUND_MESSAGE, KrbClientEventType.TGT_INTENT, KrbClientEventType.TKT_INTENT }; } @Override protected void doHandle(Event event) throws Exception { EventType eventType = event.getEventType(); if (eventType == KrbClientEventType.TGT_INTENT || eventType == KrbClientEventType.TKT_INTENT) { KdcRequest kdcRequest = (KdcRequest) event.getEventData(); handleKdcRequest(kdcRequest); } else if (event.getEventType() == TransportEventType.INBOUND_MESSAGE) { handleMessage((MessageEvent) event); } } protected void handleKdcRequest(KdcRequest kdcRequest) throws KrbException { kdcRequest.process(); KdcReq kdcReq = kdcRequest.getKdcReq(); Transport transport = kdcRequest.getTransport(); transport.setAttachment(kdcRequest); KrbUtil.sendMessage(kdcReq, transport); } protected void handleMessage(MessageEvent event) throws Exception { ByteBuffer message = event.getMessage(); KrbMessage kdcRep = KrbUtil.decodeMessage(message); KrbMessageType messageType = kdcRep.getMsgType(); if (messageType == KrbMessageType.AS_REP) { KdcRequest kdcRequest = (KdcRequest) event.getTransport().getAttachment(); kdcRequest.processResponse((KdcRep) kdcRep); dispatch(KrbClientEvent.createTgtResultEvent((AsRequest) kdcRequest)); } else if (messageType == KrbMessageType.TGS_REP) { KdcRequest kdcRequest = (KdcRequest) event.getTransport().getAttachment(); kdcRequest.processResponse((KdcRep) kdcRep); dispatch(KrbClientEvent.createTktResultEvent((TgsRequest) kdcRequest)); } } }