package gov.nist.javax.sip.clientauthutils;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import javax.sip.*;
import javax.sip.header.*;
import javax.sip.address.*;
import javax.sip.message.*;
/**
* A cache of authorization headers to be used for subsequent processing when we
* set up calls. We cache credentials on a per proxy domain per user basis.
*
*/
class CredentialsCache {
/**
* The key for this map is the proxy domain name. A given proxy authorizes a
* user for a number of domains. The Hashtable value of the mapping is a
* mapping of user names to AuthorizationHeader list for that proxy domain.
*/
private ConcurrentHashMap<String, List<AuthorizationHeader>> authorizationHeaders =
new ConcurrentHashMap<String, List<AuthorizationHeader>>();
private Timer timer;
class TimeoutTask extends TimerTask {
String callId;
String userName;
public TimeoutTask(String userName, String proxyDomain) {
this.callId = proxyDomain;
this.userName = userName;
}
@Override
public void run() {
authorizationHeaders.remove(callId);
}
}
CredentialsCache (Timer timer) {
this.timer = timer;
}
/**
* Cache the bindings of proxyDomain and authorization header.
*
* @param callid
* the id of the call that the <tt>authorization</tt> header
* belongs to.
* @param authorization
* the authorization header that we'd like to cache.
*/
void cacheAuthorizationHeader(String callId,
AuthorizationHeader authorization, int cacheTime) {
String user = authorization.getUsername();
if ( callId == null) throw new NullPointerException("Call ID is null!");
if ( authorization == null) throw new NullPointerException("Null authorization domain");
List<AuthorizationHeader> authHeaders = authorizationHeaders.get(callId);
if (authHeaders == null) {
authHeaders = new LinkedList<AuthorizationHeader>();
authorizationHeaders.put(callId, authHeaders);
} else {
String realm = authorization.getRealm();
for (ListIterator<AuthorizationHeader> li = authHeaders.listIterator(); li.hasNext();) {
AuthorizationHeader authHeader = (AuthorizationHeader) li.next();
if ( realm.equals(authHeader.getRealm()) ) {
li.remove();
}
}
}
authHeaders.add(authorization);
TimeoutTask timeoutTask = new TimeoutTask( callId,user);
if ( cacheTime != -1)
this.timer.schedule(timeoutTask, cacheTime*1000);
}
/**
* Returns an authorization header cached for the specified call id and null
* if no authorization header has been previously cached for this call.
*
* @param callid
* the call id that we'd like to retrive a cached authorization
* header for.
*
* @return authorization header corresponding to that user for the given
* proxy domain.
*/
Collection<AuthorizationHeader> getCachedAuthorizationHeaders(
String callid) {
if (callid == null)
throw new NullPointerException("Null arg!");
return this.authorizationHeaders.get(callid);
}
/**
* Remove a cached authorization header.
*
* @param callId
*/
public void removeAuthenticationHeader(String callId) {
this.authorizationHeaders.remove(callId);
}
}