Author: erodriguez
Date: Mon Nov 1 19:04:33 2004
New Revision: 56334
Modified:
incubator/directory/kerberos/trunk/source/main/org/apache/kerberos/kdc/AuthenticationService.java
incubator/directory/kerberos/trunk/source/main/org/apache/kerberos/kdc/KdcDispatcher.java
incubator/directory/kerberos/trunk/source/main/org/apache/kerberos/kdc/TicketGrantingService.java
Log:
Updated dispatcher, AS, and TGS services to properly return error messages to
clients.
Modified:
incubator/directory/kerberos/trunk/source/main/org/apache/kerberos/kdc/AuthenticationService.java
==============================================================================
---
incubator/directory/kerberos/trunk/source/main/org/apache/kerberos/kdc/AuthenticationService.java
(original)
+++
incubator/directory/kerberos/trunk/source/main/org/apache/kerberos/kdc/AuthenticationService.java
Mon Nov 1 19:04:33 2004
@@ -44,27 +44,29 @@
public AuthenticationReply getReplyFor(KdcRequest request) throws
KerberosException {
KerberosPrincipal clientPrincipal =
request.getClientPrincipal();
-
- System.out.println("Client: " + clientPrincipal.toString());
- PrincipalStoreEntry clientEntry =
_bootstrap.getEntry(clientPrincipal);
EncryptionKey clientKey;
- if (clientEntry != null) {
- clientKey = clientEntry.getEncryptionKey();
- } else {
- System.out.println("Going to look up client");
- clientKey =
_store.getEntry(clientPrincipal).getEncryptionKey();
+ try {
+ PrincipalStoreEntry clientEntry =
_bootstrap.getEntry(clientPrincipal);
+ if (clientEntry != null) {
+ clientKey = clientEntry.getEncryptionKey();
+ } else {
+ clientKey =
_store.getEntry(clientPrincipal).getEncryptionKey();
+ }
+ } catch (Exception e) {
+ throw KerberosException.KDC_ERR_C_PRINCIPAL_UNKNOWN;
}
KerberosPrincipal serverPrincipal =
request.getServerPrincipal();
-
- System.out.println("Server: " + serverPrincipal.toString());
- PrincipalStoreEntry serverEntry =
_bootstrap.getEntry(serverPrincipal);
EncryptionKey serverKey;
- if (serverEntry != null) {
- serverKey = serverEntry.getEncryptionKey();
- } else {
- System.out.println("Going to look up client");
- serverKey =
_store.getEntry(serverPrincipal).getEncryptionKey();
+ try {
+ PrincipalStoreEntry serverEntry =
_bootstrap.getEntry(serverPrincipal);
+ if (serverEntry != null) {
+ serverKey = serverEntry.getEncryptionKey();
+ } else {
+ serverKey =
_store.getEntry(serverPrincipal).getEncryptionKey();
+ }
+ } catch (Exception e) {
+ throw KerberosException.KDC_ERR_S_PRINCIPAL_UNKNOWN;
}
verifyPreAuthentication(request, clientPrincipal);
Modified:
incubator/directory/kerberos/trunk/source/main/org/apache/kerberos/kdc/KdcDispatcher.java
==============================================================================
---
incubator/directory/kerberos/trunk/source/main/org/apache/kerberos/kdc/KdcDispatcher.java
(original)
+++
incubator/directory/kerberos/trunk/source/main/org/apache/kerberos/kdc/KdcDispatcher.java
Mon Nov 1 19:04:33 2004
@@ -34,8 +34,9 @@
private ReplayCache _replay = new InMemoryReplayCache();
- private KdcRequestDecoder _decoder = new KdcRequestDecoder();
- private KdcReplyEncoder _encoder = new KdcReplyEncoder();
+ private KdcRequestDecoder _decoder = new KdcRequestDecoder();
+ private KdcReplyEncoder _encoder = new KdcReplyEncoder();
+ private ErrorMessageEncoder _errorEncoder = new ErrorMessageEncoder();
private PrincipalStore _bootstrap;
private CryptoService _cryptoService;
@@ -44,6 +45,7 @@
private AuthenticationService _authService;
private TicketGrantingService _tgsService;
+ private ErrorService _errorService;
public KdcDispatcher(KdcConfiguration config, BootstrapStore bootstrap,
PrincipalStore store) {
_config = config;
@@ -51,48 +53,51 @@
_store = store;
_cryptoService = new CryptoService(_config);
+ _errorService = new ErrorService(_config);
_authService = new AuthenticationService(_store, _bootstrap,
_cryptoService, _config);
_tgsService = new TicketGrantingService(_store, _bootstrap,
_cryptoService, _config, _replay);
}
- public byte[] dispatch(byte[] requestBytes) throws IOException,
KerberosException {
+ public byte[] dispatch(byte[] requestBytes) throws IOException {
ByteArrayInputStream input = new
ByteArrayInputStream(requestBytes);
ByteArrayOutputStream output = new ByteArrayOutputStream();
- KdcRequest request = _decoder.decode(input);
-
- byte messageType = requestBytes[0];
-
- switch (messageType) {
-
- case AS_REQ:
- // generate the reply
- AuthenticationReply authReply =
_authService.getReplyFor(request);
- // ASN1 encode the reply
- _encoder.encode(authReply, output);
-
- break;
+ try {
+ KdcRequest request = _decoder.decode(input);
+
+ byte messageType = requestBytes[0];
- case TGS_REQ:
- // generate the reply
- TicketGrantReply ticketReply =
_tgsService.getReplyFor(request);
- // ASN1 encode the reply
- _encoder.encode(ticketReply, output);
+ switch (messageType) {
- break;
-
- case AS_REP:
- case TGS_REP:
- throw new IOException("We should not be receiving reply
messages");
-
- default:
- System.out.println("Message received with tag "
+ messageType);
+ case AS_REQ:
+ // generate the reply
+ AuthenticationReply authReply =
_authService.getReplyFor(request);
+ // ASN1 encode the reply
+ _encoder.encode(authReply, output);
+ break;
+
+ case TGS_REQ:
+ // generate the reply
+ TicketGrantReply ticketReply =
_tgsService.getReplyFor(request);
+ // ASN1 encode the reply
+ _encoder.encode(ticketReply, output);
+ break;
+
+ case AS_REP:
+ case TGS_REP:
+ throw KerberosException.KRB_AP_ERR_BADDIRECTION;
+
+ default:
+ throw
KerberosException.KRB_AP_ERR_MSG_TYPE;
+ }
+ } catch (KerberosException ke) {
+ System.out.println("Returning error message: " +
ke.getMessage());
+ ErrorMessage errorMessage =
_errorService.getReplyFor(ke);
+ _errorEncoder.encode(errorMessage, output);
}
- byte[] replyBytes = output.toByteArray();
-
- return replyBytes;
+ return output.toByteArray();
}
}
Modified:
incubator/directory/kerberos/trunk/source/main/org/apache/kerberos/kdc/TicketGrantingService.java
==============================================================================
---
incubator/directory/kerberos/trunk/source/main/org/apache/kerberos/kdc/TicketGrantingService.java
(original)
+++
incubator/directory/kerberos/trunk/source/main/org/apache/kerberos/kdc/TicketGrantingService.java
Mon Nov 1 19:04:33 2004
@@ -55,8 +55,6 @@
public TicketGrantReply getReplyFor(KdcRequest request) throws
KerberosException, IOException {
- System.out.println("Got request for " +
request.getServerPrincipal());
-
ApplicationRequest authHeader = getAuthHeader(request);
Ticket tgt = authHeader.getTicket();
@@ -76,22 +74,15 @@
TicketGrantReply reply = getReply(tgt, newTicket, sessionKey,
request);
if (authenticator.getSubSessionKey() != null) {
- System.out.println("Using authenticator sub session
key.");
EncryptionKey subKey = authenticator.getSubSessionKey();
encryptReplyPart(reply, subKey);
} else {
- System.out.println("Using session key.");
encryptReplyPart(reply, tgt.getSessionKey());
}
return reply;
}
- /*
- * Reading the application request requires first determining the server
- * for which a ticket was issued, and choosing the correct key for
decryption.
- * The name of the server appears in the plaintext part of the ticket.
- */
private ApplicationRequest getAuthHeader(KdcRequest request) throws
KerberosException, IOException {
if (request.getPaData()[0].getDataType() !=
PreAuthenticationDataType.PA_TGS_REQ)
@@ -125,7 +116,6 @@
if (serverEntry != null) {
serverKey = serverEntry.getEncryptionKey();
} else {
- System.out.println("Going to look up client");
serverKey =
_store.getEntry(serverPrincipal).getEncryptionKey();
}
}
@@ -194,17 +184,11 @@
return authenticator;
}
- /*
- * Note that the realm in which the Kerberos server is operating is
determined by
- * the instance from the ticket-granting ticket. The realm in the
ticket-granting
- * ticket is the realm under which the ticket granting ticket was
issued. It is
- * possible for a single Kerberos server to support more than one realm.
- */
private void verifyTicket(ApplicationRequest authHeader, KdcRequest
request)
throws KerberosException {
Ticket tgt = authHeader.getTicket();
- if
(!tgt.getRealm().toString().equals(_config.getPrimaryRealm()) &&
+ if (!tgt.getRealm().equals(_config.getPrimaryRealm()) &&
!tgt.getServerPrincipal().equals(request.getServerPrincipal()))
throw KerberosException.KRB_AP_ERR_NOT_US;
}
@@ -251,16 +235,14 @@
// TODO - allow lookup with realm
try {
KerberosPrincipal serverPrincipal =
request.getServerPrincipal();
- System.out.println(serverPrincipal.getName());
PrincipalStoreEntry serverEntry =
_bootstrap.getEntry(serverPrincipal);
if (serverEntry != null) {
serverKey = serverEntry.getEncryptionKey();
} else {
- System.out.println("Going to look up client");
serverKey =
_store.getEntry(serverPrincipal).getEncryptionKey();
}
- } catch (KerberosException ke) {
+ } catch (Exception e) {
/*
if (!server) then
if (is_foreign_tgt_name(server)) then