blob: 606c42369f178b4202aae17176d6dba19d246453 [file] [log] [blame]
/**
* 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.wss4j.common.kerberos;
import java.security.Key;
import org.ietf.jgss.GSSContext;
import org.ietf.jgss.GSSException;
/**
* Encapsulates Kerberos token (service ticket) and secret key returned by
* {@link KerberosClientExceptionAction}.
*
* The secret key might be null, in which case it must be obtained from the current subject's
* {@link javax.security.auth.kerberos.KerberosTicket} private credential.
*
* @author bgde
*/
public class KerberosContext {
private static final org.slf4j.Logger LOG =
org.slf4j.LoggerFactory.getLogger(KerberosContext.class);
private boolean disposed;
private GSSContext gssContext;
private byte[] kerberosToken;
private Key secretKey;
/**
* @return The Kerberos service ticket bytes or null they are not available/set.
* @throws IllegalStateException If this context was already disposed.
*/
public byte[] getKerberosToken() {
if (disposed) {
throw new IllegalStateException("Kerberos context is disposed.");
}
return kerberosToken;
}
public void setKerberosToken(byte[] kerberosToken) {
this.kerberosToken = kerberosToken;
}
/**
* @return The secret session key, or null if it is not available.
* In this case it must be obtained from the current subject's {@link javax.security.auth.kerberos.KerberosTicket KerberosTicket} private credential.
*
* @see {@link javax.security.auth.kerberos.KerberosTicket#getSessionKey()}
* @throws IllegalStateException If this context was already disposed.
*/
public Key getSecretKey() {
if (disposed) {
throw new IllegalStateException("Kerberos context is disposed.");
}
return secretKey;
}
public void setSecretKey(Key secretKey) {
this.secretKey = secretKey;
}
/**
* @return The GSSContext as initialized during Kerberos service ticket retrieval.
* @throws IllegalStateException If this context was already disposed.
*/
public GSSContext getGssContext() {
if (disposed) {
throw new IllegalStateException("Kerberos context is disposed.");
}
return this.gssContext;
}
public void setGssContext(GSSContext gssContext) {
this.gssContext = gssContext;
}
/**
* Destroys all data held in this context instance. After calling this method,
* an attempt to retrieve any field of this context instance will throw an IllegalArgumentException.
*/
public void dispose() {
if (!disposed) {
if (kerberosToken != null) {
for (int i = 0; i < kerberosToken.length; i++) {
kerberosToken[i] = 0;
}
}
secretKey = null;
if (gssContext != null) {
try {
gssContext.dispose();
} catch (GSSException e) {
LOG.error("Error disposing of the GSSContext", e);
}
}
disposed = true;
}
}
/**
* Checks if this context instance is already destroyed.
*/
public boolean isDisposed() {
return disposed;
}
}