CasConnectionContext
CasConnectionContext extends LocalConnectionContext to offer CAS-specific services.
package edu.yale.its.tp.portal.security;
import java.util.Enumeration;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jasig.portal.ChannelRuntimeData;
import org.jasig.portal.ChannelStaticData;
import org.jasig.portal.security.IPerson;
import org.jasig.portal.security.ISecurityContext;
import org.jasig.portal.security.LocalConnectionContext;
/**
* Connection context that uses a security context implementing
* IYaleSecurityContext to obtain a proxy tickets for use in descriptors
* provided by this connection context.
*
* @author unattributed
* @author andrew.petro@yale.edu
* @author susan.bramhall@yale.edu
*/
public class CasConnectionContext extends LocalConnectionContext {
private static final Log log = LogFactory
.getLog(CasConnectionContext.class);
private ChannelStaticData staticData = null;
private IPerson person = null;
private IYaleCasContext yaleSecurityContext = null;
public void init(ChannelStaticData sd) {
this.staticData = sd;
this.person = sd.getPerson();
ISecurityContext ic = this.person.getSecurityContext();
if (ic instanceof IYaleCasContext && ic.isAuthenticated())
this.yaleSecurityContext = (IYaleCasContext) ic;
// loop through subcontexts to find implementations of
// IYaleSecurityContext
Enumeration en = ic.getSubContexts();
while (en.hasMoreElements()) {
ISecurityContext sctx = (ISecurityContext) en.nextElement();
if (sctx instanceof IYaleCasContext && sctx.isAuthenticated())
this.yaleSecurityContext = (IYaleCasContext) sctx;
}
if (this.yaleSecurityContext == null)
log.error("Unable to find authenticated IYaleCasContext");
}
public String getDescriptor(String descriptor, ChannelRuntimeData rd) {
if (log.isTraceEnabled()) {
log.trace("getDescriptor(" + descriptor + ", " + rd + ")");
}
if (rd.getHttpRequestMethod().equals("GET")) {
// get proxy service ticket for the service if needed
String proxyTicket = null;
if (this.yaleSecurityContext != null)
try {
proxyTicket = this.yaleSecurityContext
.getCasServiceToken(descriptor);
} catch (CASProxyTicketAcquisitionException casex) {
log.error(
"getDescriptor() - Error retreiving proxy ticket.",
casex);
}
// if the descriptor was null then at least return
// the pst as a unique string
if (descriptor == null)
descriptor = proxyTicket;
// append ticket parameter and value to query string
if (descriptor.indexOf("?") != -1) {
descriptor = descriptor + "&ticket=" + proxyTicket;
} else {
descriptor = descriptor + "?ticket=" + proxyTicket;
}
}
if (log.isTraceEnabled()) {
log.trace("returning from getDescriptor() with [CAS:" + descriptor
+ "]");
}
return descriptor;
}
/**
* Returns url with proxy service ticket appended. Looks for static
* parameter upc_cas_service_uri and uses that for service. If not
* specified, uses the passed uri
*
* @param descriptor
* The original descriptor.
* @return descriptor with CAS proxy ticket parameter appended.
*/
public String getDescriptor(String descriptor) {
if (log.isTraceEnabled()) {
log.trace("entering getDescriptor(" + descriptor + ")");
}
String proxyTicket = null;
if (this.yaleSecurityContext != null)
try {
// if no specified parameter for service, use target descriptor
String casUri = this.staticData
.getParameter("upc_cas_service_uri");
if (casUri != null)
proxyTicket = this.yaleSecurityContext.getCasServiceToken(casUri);
else
proxyTicket = this.yaleSecurityContext
.getCasServiceToken(descriptor);
} catch (CASProxyTicketAcquisitionException casex) {
log
.error(
"CasConnectionContext::getDescriptor() - Error retreiving proxy ticket.",
casex);
}
// append ticket parameter and value to query string
if (descriptor.indexOf("?") != -1)
descriptor = descriptor + "&ticket=" + proxyTicket;
else
descriptor = descriptor + "?ticket=" + proxyTicket;
if (log.isTraceEnabled()){
log.trace("returning from getDescriptor() with [CAS:" + descriptor + "]");
}
return descriptor;
}
public String getPostData(ChannelRuntimeData rd) {
// get proxy service ticket for the service if needed
String proxyTicket = null;
if (this.yaleSecurityContext != null)
try {
String xmlUri = rd.getParameter("cw_xml");
if (xmlUri == null)
xmlUri = this.staticData.getParameter("cw_xml");
proxyTicket = this.yaleSecurityContext.getCasServiceToken(xmlUri);
} catch (CASProxyTicketAcquisitionException casex) {
log.error("sendLocalData() - Error retreiving proxy ticket.",
casex);
}
return ("ticket=" + proxyTicket);
}
public void sendLocalData(Object conParam, ChannelRuntimeData rd) {
// CAS does not have anything to do here. Post data is handled by the
// getPostData method instead of being sent separately in this method.
return;
}
public String toString() {
StringBuffer sb = new StringBuffer();
sb.append(this.getClass().getName());
sb.append(" staticData:");
sb.append(this.staticData);
sb.append(" person:");
sb.append(this.person);
sb.append(" yaleSecurityContext:");
sb.append(this.yaleSecurityContext);
return sb.toString();
}
}