From 7268afa0f4c8a08c5a48cbbddcfcc03a3cccb2c2 Mon Sep 17 00:00:00 2001
From: Scott Battaglia The authorization package contains the interface for a simple
-abstraction for authorizing users to use an application. It is not a
-complete role-based or access control authorization system.
+ *
* In general, this class will make a call to the CAS server with some specified * parameters and receive an XML response to parse. - * + * * @author Scott Battaglia * @version $Revision$ $Date$ * @since 3.0 */ public final class Cas20ProxyRetriever implements ProxyRetriever { - /** Instance of Commons Logging. */ - protected Log log = LogFactory.getLog(this.getClass()); + /** + * Instance of Commons Logging. + */ + protected final Log log = LogFactory.getLog(this.getClass()); - /** Url to CAS server. */ - private String casServerUrl; + /** + * Url to CAS server. + */ + private final String casServerUrl; - /** Instance of HttpClient for connecting to server. */ - private HttpClient httpClient; + /** + * Instance of HttpClient for connecting to server. + */ + private final HttpClient httpClient; + + /** + * Main Constructor. + * + * @param casServerUrl the URL to the CAS server (i.e. http://localhost/cas/) + * @param httpClient an Instance of a thread-safe HttpClient. + */ + public Cas20ProxyRetriever(final String casServerUrl, final HttpClient httpClient) { + CommonUtils.assertNotNull(casServerUrl, + "casServerUrl cannot be null."); + CommonUtils + .assertNotNull(httpClient, "httpClient cannot be null."); + this.casServerUrl = casServerUrl; + this.httpClient = httpClient; + } public String getProxyTicketIdFor(final String proxyGrantingTicketId, - final Service targetService) { + final Service targetService) { final String url = constructUrl(proxyGrantingTicketId, targetService - .getId()); + .getId()); final GetMethod method = new GetMethod(url); try { @@ -53,7 +74,7 @@ public final class Cas20ProxyRetriever implements ProxyRetriever { final String response = method.getResponseBodyAsString(); final String error = XmlUtils.getTextForElement(response, - "proxyFailure"); + "proxyFailure"); if (CommonUtils.isNotEmpty(error)) { log.debug(error); @@ -71,28 +92,13 @@ public final class Cas20ProxyRetriever implements ProxyRetriever { } private String constructUrl(final String proxyGrantingTicketId, - final String targetService) { + final String targetService) { try { return this.casServerUrl + "proxy" + "?pgt=" - + proxyGrantingTicketId + "&targetService=" - + URLEncoder.encode(targetService, "UTF-8"); + + proxyGrantingTicketId + "&targetService=" + + URLEncoder.encode(targetService, "UTF-8"); } catch (final UnsupportedEncodingException e) { throw new RuntimeException(e); } } - - public void setCasServerUrl(final String casServerUrl) { - this.casServerUrl = casServerUrl; - } - - public void setHttpClient(final HttpClient httpClient) { - this.httpClient = httpClient; - } - - public void init() { - CommonUtils.assertNotNull(this.casServerUrl, - "casServerUrl cannot be null."); - CommonUtils - .assertNotNull(this.httpClient, "httpClient cannot be null."); - } } diff --git a/cas-client-core/src/main/java/org/jasig/cas/client/proxy/ProxyGrantingTicketStorage.java b/cas-client-core/src/main/java/org/jasig/cas/client/proxy/ProxyGrantingTicketStorage.java index dd6785a..8495973 100644 --- a/cas-client-core/src/main/java/org/jasig/cas/client/proxy/ProxyGrantingTicketStorage.java +++ b/cas-client-core/src/main/java/org/jasig/cas/client/proxy/ProxyGrantingTicketStorage.java @@ -8,7 +8,7 @@ package org.jasig.cas.client.proxy; /** * Interface for the storage and retrieval of ProxyGrantingTicketIds by mapping * them to a specific ProxyGrantingTicketIou. - * + * * @author Scott Battaglia * @version $Revision$ $Date$ * @since 3.0 @@ -17,9 +17,9 @@ public interface ProxyGrantingTicketStorage { /** * Method to save the ProxyGrantingTicket to the backing storage facility. - * + * * @param proxyGrantingTicketIou used as the key - * @param proxyGrantingTicket used as the value + * @param proxyGrantingTicket used as the value */ public void save(String proxyGrantingTicketIou, String proxyGrantingTicket); @@ -28,7 +28,7 @@ public interface ProxyGrantingTicketStorage { * ProxyGrantingTicketIou. Note that implementations are not guaranteed to * return the same result if retrieve is called twice with the same * proxyGrantingTicketIou. - * + * * @param proxyGrantingTicketIou used as the key * @return the ProxyGrantingTicket Id or null if it can't be found */ diff --git a/cas-client-core/src/main/java/org/jasig/cas/client/proxy/ProxyGrantingTicketStorageImpl.java b/cas-client-core/src/main/java/org/jasig/cas/client/proxy/ProxyGrantingTicketStorageImpl.java index 11e4b05..ba74a23 100644 --- a/cas-client-core/src/main/java/org/jasig/cas/client/proxy/ProxyGrantingTicketStorageImpl.java +++ b/cas-client-core/src/main/java/org/jasig/cas/client/proxy/ProxyGrantingTicketStorageImpl.java @@ -5,33 +5,47 @@ */ package org.jasig.cas.client.proxy; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; +import java.util.*; /** * Implementation of {@link ProxyGrantingTicketStorage} that is backed by a * HashMap that keeps a ProxyGrantingTicket for a specified amount of time. - *+ *
* A cleanup thread is run periodically to clean out the HashMap. - * + * * @author Scott Battaglia * @version $Revision$ $Date$ * @since 3.0 */ public final class ProxyGrantingTicketStorageImpl implements - ProxyGrantingTicketStorage { + ProxyGrantingTicketStorage { /** * Default timeout in milliseconds. */ private static final long DEFAULT_TIMEOUT = 60000; - private Map cache = new HashMap(); + private final Map cache = new HashMap(); - private long timeout = DEFAULT_TIMEOUT; + /** + * Constructor set the timeout to the default value. + */ + public ProxyGrantingTicketStorageImpl() { + this(DEFAULT_TIMEOUT); + } + + /** + * Sets the amount of time to hold on to a ProxyGrantingTicket if its never + * been retrieved. + * + * @param timeout the time to hold on to the ProxyGrantingTicket + */ + public ProxyGrantingTicketStorageImpl(final long timeout) { + final Thread thread = new ProxyGrantingTicketCleanupThread( + timeout, this.cache); + thread.setDaemon(true); + thread.start(); + } /** * NOTE: you can only retrieve a ProxyGrantingTicket once with this method. @@ -39,7 +53,7 @@ public final class ProxyGrantingTicketStorageImpl implements */ public String retrieve(final String proxyGrantingTicketIou) { final ProxyGrantingTicketHolder holder = (ProxyGrantingTicketHolder) this.cache - .get(proxyGrantingTicketIou); + .get(proxyGrantingTicketIou); if (holder == null) { return null; @@ -51,31 +65,14 @@ public final class ProxyGrantingTicketStorageImpl implements } public void save(final String proxyGrantingTicketIou, - final String proxyGrantingTicket) { + final String proxyGrantingTicket) { final ProxyGrantingTicketHolder holder = new ProxyGrantingTicketHolder( - proxyGrantingTicket); + proxyGrantingTicket); this.cache.put(proxyGrantingTicketIou, holder); } - public void init() throws Exception { - final Thread thread = new ProxyGrantingTicketCleanupThread( - this.timeout, this.cache); - thread.setDaemon(true); - thread.start(); - } - - /** - * Sets the amount of time to hold on to a ProxyGrantingTicket if its never - * been retrieved. - * - * @param timeout the time to hold on to the ProxyGrantingTicket - */ - public void setTimeout(final long timeout) { - this.timeout = timeout; - } - - private class ProxyGrantingTicketHolder { + private final class ProxyGrantingTicketHolder { private final String proxyGrantingTicket; @@ -95,14 +92,14 @@ public final class ProxyGrantingTicketStorageImpl implements } } - private class ProxyGrantingTicketCleanupThread extends Thread { + private final class ProxyGrantingTicketCleanupThread extends Thread { private final long timeout; private final Map cache; public ProxyGrantingTicketCleanupThread(final long timeout, - final Map cache) { + final Map cache) { this.timeout = timeout; this.cache = cache; } @@ -120,10 +117,10 @@ public final class ProxyGrantingTicketStorageImpl implements synchronized (this.cache) { for (final Iterator iter = this.cache.keySet().iterator(); iter - .hasNext();) { + .hasNext();) { final Object key = iter.next(); final ProxyGrantingTicketHolder holder = (ProxyGrantingTicketHolder) this.cache - .get(key); + .get(key); if (holder.isExpired(this.timeout)) { itemsToRemove.add(key); @@ -131,7 +128,7 @@ public final class ProxyGrantingTicketStorageImpl implements } for (final Iterator iter = itemsToRemove.iterator(); iter - .hasNext();) { + .hasNext();) { this.cache.remove(iter.next()); } } diff --git a/cas-client-core/src/main/java/org/jasig/cas/client/proxy/ProxyRetriever.java b/cas-client-core/src/main/java/org/jasig/cas/client/proxy/ProxyRetriever.java index 08228e1..4bea4a9 100644 --- a/cas-client-core/src/main/java/org/jasig/cas/client/proxy/ProxyRetriever.java +++ b/cas-client-core/src/main/java/org/jasig/cas/client/proxy/ProxyRetriever.java @@ -10,7 +10,7 @@ import org.jasig.cas.authentication.principal.Service; /** * Interface to abstract the retrieval of a proxy ticket to make the * implementation a black box to the client. - * + * * @author Scott Battaglia * @version $Revision$ $Date$ * @since 3.0 @@ -19,11 +19,11 @@ public interface ProxyRetriever { /** * Retrieves a proxy ticket for a specific targetService. - * + * * @param proxyGrantingTicketId the ProxyGrantingTicketId - * @param targetService the service we want to proxy. + * @param targetService the service we want to proxy. * @return the ProxyTicket Id if Granted, null otherwise. */ String getProxyTicketIdFor(String proxyGrantingTicketId, - Service targetService); + Service targetService); } diff --git a/cas-client-core/src/main/java/org/jasig/cas/client/proxy/SpringConfiguredProxyReceptorServlet.java b/cas-client-core/src/main/java/org/jasig/cas/client/proxy/SpringConfiguredProxyReceptorServlet.java index 8baad5e..f90a566 100644 --- a/cas-client-core/src/main/java/org/jasig/cas/client/proxy/SpringConfiguredProxyReceptorServlet.java +++ b/cas-client-core/src/main/java/org/jasig/cas/client/proxy/SpringConfiguredProxyReceptorServlet.java @@ -5,49 +5,50 @@ */ package org.jasig.cas.client.proxy; -import java.util.Map; +import org.springframework.web.context.WebApplicationContext; +import org.springframework.web.context.support.WebApplicationContextUtils; import javax.servlet.ServletConfig; import javax.servlet.ServletException; - -import org.springframework.web.context.WebApplicationContext; -import org.springframework.web.context.support.WebApplicationContextUtils; +import java.util.Map; /** * Implementation of an HttpServlet that accepts ProxyGrantingTicketIous and * ProxyGrantingTickets and stores them in an implementation of * {@link ProxyGrantingTicketStorage}. - *+ *
* Note thatProxyReceptorServlet attempts to load a
* {@link ProxyGrantingTicketStorage} from the ApplicationContext either via the
* name "proxyGrantingTicketStorage" or by type. One of these two must exist
* within the applicationContext or the initialization of the
* ProxyReceptorServlet will fail.
- *
+ *
* @author Scott Battaglia
* @version $Revision$ $Date$
* @since 3.0
*/
public final class SpringConfiguredProxyReceptorServlet extends
- AbstractProxyReceptorServlet {
+ AbstractProxyReceptorServlet {
- /** Unique Id for serialization */
+ /**
+ * Unique Id for serialization
+ */
private static final long serialVersionUID = -5642050740265266568L;
public void init(final ServletConfig servletConfig) throws ServletException {
final WebApplicationContext context = WebApplicationContextUtils
- .getRequiredWebApplicationContext(servletConfig.getServletContext());
+ .getRequiredWebApplicationContext(servletConfig.getServletContext());
if (context.containsBean(CONST_PROXY_GRANTING_TICKET_STORAGE_BEAN_NAME)) {
this
- .setProxyGrantingTicketStorage((ProxyGrantingTicketStorage) context
- .getBean(CONST_PROXY_GRANTING_TICKET_STORAGE_BEAN_NAME,
- ProxyGrantingTicketStorage.class));
+ .setProxyGrantingTicketStorage((ProxyGrantingTicketStorage) context
+ .getBean(CONST_PROXY_GRANTING_TICKET_STORAGE_BEAN_NAME,
+ ProxyGrantingTicketStorage.class));
return;
}
final Map map = context
- .getBeansOfType(ProxyGrantingTicketStorage.class);
+ .getBeansOfType(ProxyGrantingTicketStorage.class);
if (map.isEmpty()) {
throw new ServletException("No ProxyGrantingTicketStorage found!");
@@ -55,11 +56,11 @@ public final class SpringConfiguredProxyReceptorServlet extends
if (map.size() > 1) {
throw new ServletException(
- "Expecting one ProxyGrantingTicketStorage and found multiple instances.");
+ "Expecting one ProxyGrantingTicketStorage and found multiple instances.");
}
setProxyGrantingTicketStorage((ProxyGrantingTicketStorage) map.get(map
- .keySet().iterator().next()));
+ .keySet().iterator().next()));
}
}
diff --git a/cas-client-core/src/main/java/org/jasig/cas/client/proxy/package.html b/cas-client-core/src/main/java/org/jasig/cas/client/proxy/package.html
index 8e28951..c3cbfc5 100644
--- a/cas-client-core/src/main/java/org/jasig/cas/client/proxy/package.html
+++ b/cas-client-core/src/main/java/org/jasig/cas/client/proxy/package.html
@@ -1,7 +1,7 @@
The proxy package includes a servlet to act as a proxy receptor, -an interface for ProxyGrantingTicketStorage and an abstraction for -retrieving proxy tickets.
+ an interface for ProxyGrantingTicketStorage and an abstraction for + retrieving proxy tickets. \ No newline at end of file diff --git a/cas-client-core/src/main/java/org/jasig/cas/client/util/CommonUtils.java b/cas-client-core/src/main/java/org/jasig/cas/client/util/CommonUtils.java index 0b3dcd2..0b5bd46 100644 --- a/cas-client-core/src/main/java/org/jasig/cas/client/util/CommonUtils.java +++ b/cas-client-core/src/main/java/org/jasig/cas/client/util/CommonUtils.java @@ -9,7 +9,7 @@ import java.util.Collection; /** * Common utilities so that we don't need to include Commons Lang. - * + * * @author Scott Battaglia * @version $Revision$ $Date$ * @since 3.0 @@ -23,8 +23,8 @@ public final class CommonUtils { /** * Check whether the object is null or not. If it is, throw an exception and * display the message. - * - * @param object the object to check. + * + * @param object the object to check. * @param message the message to display if the object is null. */ public static void assertNotNull(final Object object, final String message) { @@ -36,8 +36,8 @@ public final class CommonUtils { /** * Check whether the collection is null or empty. If it is, throw an * exception and display the message. - * - * @param c the collecion to check. + * + * @param c the collecion to check. * @param message the message to display if the object is null. */ public static void assertNotEmpty(final Collection c, final String message) { @@ -50,8 +50,8 @@ public final class CommonUtils { /** * Assert that the statement is true, otherwise throw an exception with the * provided message. - * - * @param cond the codition to assert is true. + * + * @param cond the codition to assert is true. * @param message the message to display if the condition is not true. */ public static void assertTrue(final boolean cond, final String message) { @@ -62,7 +62,7 @@ public final class CommonUtils { /** * Determines whether the String is null or of length 0. - * + * * @param string the string to check * @return true if its null or length of 0, false otherwise. */ @@ -73,7 +73,7 @@ public final class CommonUtils { /** * Determines if the String is not empty. A string is not empty if it is not * null and has a length > 0. - * + * * @param string the string to check * @return true if it is not empty, false otherwise. */ @@ -84,7 +84,7 @@ public final class CommonUtils { /** * Determines if a String is blank or not. A String is blank if its empty or * if it only contains spaces. - * + * * @param string the string to check * @return true if its blank, false otherwise. */ @@ -95,7 +95,7 @@ public final class CommonUtils { /** * Determines if a string is not blank. A string is not blank if it contains * at least one non-whitespace character. - * + * * @param string the string to check. * @return true if its not blank, false otherwise. */ diff --git a/cas-client-core/src/main/java/org/jasig/cas/client/util/DelegatingFilter.java b/cas-client-core/src/main/java/org/jasig/cas/client/util/DelegatingFilter.java index c4768bc..cce738e 100644 --- a/cas-client-core/src/main/java/org/jasig/cas/client/util/DelegatingFilter.java +++ b/cas-client-core/src/main/java/org/jasig/cas/client/util/DelegatingFilter.java @@ -10,7 +10,6 @@ import org.apache.commons.logging.LogFactory; import javax.servlet.*; import java.io.IOException; -import java.util.HashMap; import java.util.Iterator; import java.util.Map; @@ -18,55 +17,89 @@ import java.util.Map; * A Delegating Filter looks up a parameter in the request object and matches * (either exact or using Regular Expressions) the value. If there is a match, * the associated filter is executed. Otherwise, the normal chain is executed. - * + * * @author Scott Battaglia * @version $Revision$ $Date$ * @since 3.0 */ public final class DelegatingFilter implements Filter { - /** Instance of Commons Logging. */ - private Log log = LogFactory.getLog(this.getClass()); + /** + * Instance of Commons Logging. + */ + private final Log log = LogFactory.getLog(this.getClass()); - /** The request parameter to look for in the Request object. */ - private String requestParameterName; + /** + * The request parameter to look for in the Request object. + */ + private final String requestParameterName; - /** The map of filters to delegate to and the criteria (as key). */ - private Map delegators = new HashMap(); + /** + * The map of filters to delegate to and the criteria (as key). + */ + private final Map delegators; - /** The default filter to use if there is no match. */ - private Filter defaultFilter; + /** + * The default filter to use if there is no match. + */ + private final Filter defaultFilter; /** * Whether the key in the delegators map is an exact match or a regular * expression. */ - private boolean exactMatch = false; + private final boolean exactMatch; + + public DelegatingFilter(final String requestParameterName, final Map delegators, final boolean exactMatch) { + this(requestParameterName, delegators, exactMatch, null); + } + + public DelegatingFilter(final String requestParameterName, final Map delegators, final boolean exactMatch, final Filter defaultFilter) { + CommonUtils.assertNotNull(requestParameterName, + "requestParameterName cannot be null."); + CommonUtils.assertTrue(!delegators.isEmpty(), + "delegators cannot be empty."); + + for (final Iterator iter = delegators.keySet().iterator(); iter + .hasNext();) { + final Object object = delegators.get(iter.next()); + + if (!Filter.class.isAssignableFrom(object.getClass())) { + throw new IllegalArgumentException( + "All value objects in the delegators map must be filters."); + } + } + + this.requestParameterName = requestParameterName; + this.delegators = delegators; + this.defaultFilter = defaultFilter; + this.exactMatch = exactMatch; + } public void destroy() { // nothing to do here } public void doFilter(final ServletRequest request, - final ServletResponse response, final FilterChain filterChain) - throws IOException, ServletException { + final ServletResponse response, final FilterChain filterChain) + throws IOException, ServletException { final String parameter = request - .getParameter(this.requestParameterName); + .getParameter(this.requestParameterName); if (CommonUtils.isNotEmpty(parameter)) { for (final Iterator iter = this.delegators.keySet().iterator(); iter - .hasNext();) { + .hasNext();) { final String key = (String) iter.next(); if ((parameter.equals(key) && this.exactMatch) - || (parameter.matches(key) && !this.exactMatch)) { + || (parameter.matches(key) && !this.exactMatch)) { final Filter filter = (Filter) this.delegators.get(key); if (log.isDebugEnabled()) { log.debug("Match found for parameter [" - + this.requestParameterName + "] with value [" - + parameter + "]. Delegating to filter [" - + filter.getClass().getName() + "]"); + + this.requestParameterName + "] with value [" + + parameter + "]. Delegating to filter [" + + filter.getClass().getName() + "]"); } filter.doFilter(request, response, filterChain); return; @@ -75,7 +108,7 @@ public final class DelegatingFilter implements Filter { } log.debug("No match found for parameter [" + this.requestParameterName - + "] with value [" + parameter + "]"); + + "] with value [" + parameter + "]"); if (this.defaultFilter != null) { this.defaultFilter.doFilter(request, response, filterChain); @@ -87,59 +120,4 @@ public final class DelegatingFilter implements Filter { public void init(final FilterConfig filterConfig) throws ServletException { // nothing to do here. } - - public void init() { - CommonUtils.assertNotNull(this.requestParameterName, - "requestParameterName cannot be null."); - CommonUtils.assertTrue(!this.delegators.isEmpty(), - "delegators cannot be empty."); - - for (final Iterator iter = this.delegators.keySet().iterator(); iter - .hasNext();) { - final Object object = this.delegators.get(iter.next()); - - if (!Filter.class.isAssignableFrom(object.getClass())) { - throw new IllegalArgumentException( - "All value objects in the delegators map must be filters."); - } - } - } - - /** - * Sets the map of delegating filters. - * - * @param delegators the map of delegators to set. - */ - public void setDelegators(final Map delegators) { - this.delegators = delegators; - } - - /** - * Marks whether the value of the parameter needs to match exactly or not. - * - * @param exactMatch the value of whether we need to match exactly or not. - */ - public void setExactMatch(final boolean exactMatch) { - this.exactMatch = exactMatch; - } - - /** - * Sets the name of the request parameter to monitor. - * - * @param requestParameterName the name of the request parameter. - */ - public void setRequestParameterName(final String requestParameterName) { - this.requestParameterName = requestParameterName; - } - - /** - * Sets the default filter to use if there are no matches. This is optional - * as the filter will just continue on the chain if there is no default. - * - * @param defaultFilter the filter to use by default. - */ - protected void setDefaultFilter(final Filter defaultFilter) { - this.defaultFilter = defaultFilter; - } - } diff --git a/cas-client-core/src/main/java/org/jasig/cas/client/util/FilterToBeanProxy.java b/cas-client-core/src/main/java/org/jasig/cas/client/util/FilterToBeanProxy.java index 7d1ed1d..a31825b 100644 --- a/cas-client-core/src/main/java/org/jasig/cas/client/util/FilterToBeanProxy.java +++ b/cas-client-core/src/main/java/org/jasig/cas/client/util/FilterToBeanProxy.java @@ -5,6 +5,8 @@ */ package org.jasig.cas.client.util; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.springframework.context.ApplicationContext; import org.springframework.web.context.support.WebApplicationContextUtils; @@ -14,52 +16,55 @@ import java.io.IOException; /** * Utility class to retrieve a Filter from a Spring-managed configuration file. * Based on the FilterToBeanProxy class in Acegi Security (but simplified) - * + * * @author Scott Battaglia * @version $Revision$ $Date$ * @since 3.0 */ public class FilterToBeanProxy implements Filter { - /** The filter we are proxying. */ + /** + * The filter we are proxying. + */ private Filter filter; - public void destroy() { + /** + * Instance of commons logging. + */ + protected final Log log = LogFactory.getLog(this.getClass()); + + public final void destroy() { // nothing to do } public final void doFilter(final ServletRequest request, - final ServletResponse response, final FilterChain chain) - throws IOException, ServletException { + final ServletResponse response, final FilterChain chain) + throws IOException, ServletException { this.filter.doFilter(request, response, chain); } public final void init(final FilterConfig filterConfig) - throws ServletException { - doInit(filterConfig); - } - - protected ApplicationContext getContext(FilterConfig filterConfig) { - return WebApplicationContextUtils - .getRequiredWebApplicationContext(filterConfig.getServletContext()); - } - - public final void doInit(final FilterConfig filterConfig) - throws ServletException { + throws ServletException { final String targetBean = filterConfig.getInitParameter("targetBean"); if (CommonUtils.isBlank(targetBean)) { throw new ServletException( - "init-parameter missing: targetBean is required."); + "init-parameter missing: targetBean is required."); } final ApplicationContext ctx = this.getContext(filterConfig); if (!ctx.containsBean(targetBean)) { throw new ServletException("targetBean '" + targetBean - + "' not found in context"); + + "' not found in context"); } + log.trace("Loading filter from Spring ApplicationContext with name: " + targetBean); this.filter = (Filter) ctx.getBean(targetBean, Filter.class); } + + protected ApplicationContext getContext(FilterConfig filterConfig) { + return WebApplicationContextUtils + .getRequiredWebApplicationContext(filterConfig.getServletContext()); + } } diff --git a/cas-client-core/src/main/java/org/jasig/cas/client/util/XmlUtils.java b/cas-client-core/src/main/java/org/jasig/cas/client/util/XmlUtils.java index cbfdfb5..e78bd50 100644 --- a/cas-client-core/src/main/java/org/jasig/cas/client/util/XmlUtils.java +++ b/cas-client-core/src/main/java/org/jasig/cas/client/util/XmlUtils.java @@ -5,10 +5,6 @@ */ package org.jasig.cas.client.util; -import java.io.StringReader; -import java.util.ArrayList; -import java.util.List; - import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.xml.sax.Attributes; @@ -18,21 +14,27 @@ import org.xml.sax.XMLReader; import org.xml.sax.helpers.DefaultHandler; import org.xml.sax.helpers.XMLReaderFactory; +import java.io.StringReader; +import java.util.ArrayList; +import java.util.List; + /** * Common utilities for easily parsing XML without duplicating logic. - * + * * @author Scott Battaglia * @version $Revision$ $Date$ * @since 3.0 */ public final class XmlUtils { - /** Static instance of Commons Logging. */ + /** + * Static instance of Commons Logging. + */ private final static Log LOG = LogFactory.getLog(XmlUtils.class); /** * Get an instance of an XML reader from the XMLReaderFactory. - * + * * @return the XMLReader. */ public static XMLReader getXmlReader() { @@ -46,32 +48,33 @@ public final class XmlUtils { /** * Retrieve the text for a group of elements. Each text element is an entry * in a list. - * + * * @param xmlAsString the xml response - * @param element the element to look for + * @param element the element to look for * @return the list of text from the elements. */ public static List getTextForElements(final String xmlAsString, - final String element) { - final List elements = new ArrayList(); + final String element) { + // XXX: optimized to 2, as most proxy chains have a length of no more than two + final List elements = new ArrayList(2); final XMLReader reader = getXmlReader(); - final DefaultHandler handler = new DefaultHandler(){ + final DefaultHandler handler = new DefaultHandler() { private boolean foundElement = false; private StringBuffer buffer = new StringBuffer(); public void startElement(final String uri, final String localName, - final String qName, final Attributes attributes) - throws SAXException { + final String qName, final Attributes attributes) + throws SAXException { if (localName.equals(element)) { this.foundElement = true; } } public void endElement(final String uri, final String localName, - final String qName) throws SAXException { + final String qName) throws SAXException { if (localName.equals(element)) { this.foundElement = false; elements.add(this.buffer.toString()); @@ -80,7 +83,7 @@ public final class XmlUtils { } public void characters(char[] ch, int start, int length) - throws SAXException { + throws SAXException { if (this.foundElement) { this.buffer.append(ch, start, length); } @@ -103,37 +106,37 @@ public final class XmlUtils { /** * Retrieve the text for a specific element (when we know there is only * one). - * + * * @param xmlAsString the xml response - * @param element the element to look for + * @param element the element to look for * @return the text value of the element. */ public static String getTextForElement(final String xmlAsString, - final String element) { + final String element) { final XMLReader reader = getXmlReader(); final StringBuffer buffer = new StringBuffer(); - final DefaultHandler handler = new DefaultHandler(){ + final DefaultHandler handler = new DefaultHandler() { private boolean foundElement = false; public void startElement(final String uri, final String localName, - final String qName, final Attributes attributes) - throws SAXException { + final String qName, final Attributes attributes) + throws SAXException { if (localName.equals(element)) { this.foundElement = true; } } public void endElement(final String uri, final String localName, - final String qName) throws SAXException { + final String qName) throws SAXException { if (localName.equals(element)) { this.foundElement = false; } } public void characters(char[] ch, int start, int length) - throws SAXException { + throws SAXException { if (this.foundElement) { buffer.append(ch, start, length); } diff --git a/cas-client-core/src/main/java/org/jasig/cas/client/validation/AbstractUrlBasedTicketValidator.java b/cas-client-core/src/main/java/org/jasig/cas/client/validation/AbstractUrlBasedTicketValidator.java index 4b01983..551809e 100644 --- a/cas-client-core/src/main/java/org/jasig/cas/client/validation/AbstractUrlBasedTicketValidator.java +++ b/cas-client-core/src/main/java/org/jasig/cas/client/validation/AbstractUrlBasedTicketValidator.java @@ -12,28 +12,36 @@ import java.net.URLEncoder; /** * Abstract class for validating tickets that defines a workflow that all ticket * validation should follow. - * + * * @author Scott Battaglia * @version $Revision$ $Date$ * @since 3.0 */ public abstract class AbstractUrlBasedTicketValidator implements - TicketValidator { + TicketValidator { - /** Instance of Commons Logging. */ - protected Log log = LogFactory.getLog(this.getClass()); + /** + * Instance of Commons Logging. + */ + protected final Log log = LogFactory.getLog(this.getClass()); - /** Url to CAS server. */ - private String casServerUrl; + /** + * Url to CAS server. + */ + private final String casServerUrl; - /** Whether this client is looking for an authentication from renew. */ - private boolean renew; + /** + * Whether this client is looking for an authentication from renew. + */ + private final boolean renew; - /** Instance of HttpClient for connecting to server. */ - private HttpClient httpClient; + /** + * Instance of HttpClient for connecting to server. + */ + private final HttpClient httpClient; public final Assertion validate(final String ticketId, final Service service) - throws ValidationException { + throws ValidationException { final String url = constructURL(ticketId, service); final String response = getResponseFromURL(url); @@ -41,13 +49,13 @@ public abstract class AbstractUrlBasedTicketValidator implements } protected abstract String constructURL(final String ticketId, - final Service service); + final Service service); protected abstract Assertion parseResponse(final String response) - throws ValidationException; + throws ValidationException; private String getResponseFromURL(final String url) - throws ValidationException { + throws ValidationException { final GetMethod method = new GetMethod(url); try { @@ -56,24 +64,25 @@ public abstract class AbstractUrlBasedTicketValidator implements } catch (Exception e) { log.error(e, e); throw new ValidationException( - "Unable to retrieve response from CAS Server.", e); + "Unable to retrieve response from CAS Server.", e); } finally { method.releaseConnection(); } } - public final void init() { - CommonUtils.assertNotNull(this.casServerUrl, - "the validationUrl cannot be null"); + protected AbstractUrlBasedTicketValidator(final String casServerUrl, final boolean renew, final HttpClient httpClient) { + CommonUtils.assertNotNull(casServerUrl, + "the validationUrl cannot be null"); CommonUtils - .assertNotNull(this.httpClient, "httpClient cannot be null."); - - afterPropertiesSetInternal(); + .assertNotNull(httpClient, "httpClient cannot be null."); + this.casServerUrl = casServerUrl; + this.renew = renew; + this.httpClient = httpClient; } /** * Helper method to encode the service url. - * + * * @param service the service url to encode. * @return the encoded service url. */ @@ -92,26 +101,4 @@ public abstract class AbstractUrlBasedTicketValidator implements protected final boolean isRenew() { return this.renew; } - - public final void setCasServerUrl(final String casServerUrl) { - this.casServerUrl = casServerUrl; - } - - public final void setHttpClient(final HttpClient httpClient) { - this.httpClient = httpClient; - } - - public final void setRenew(final boolean renew) { - this.renew = renew; - } - - /** - * Template method for afterProperties() for subclasses to call. - * - * @throws Exception - */ - protected void afterPropertiesSetInternal() { - // template method - } - } diff --git a/cas-client-core/src/main/java/org/jasig/cas/client/validation/Assertion.java b/cas-client-core/src/main/java/org/jasig/cas/client/validation/Assertion.java index 3bfd34e..eda5efb 100644 --- a/cas-client-core/src/main/java/org/jasig/cas/client/validation/Assertion.java +++ b/cas-client-core/src/main/java/org/jasig/cas/client/validation/Assertion.java @@ -5,14 +5,14 @@ */ package org.jasig.cas.client.validation; +import org.jasig.cas.authentication.principal.Principal; + import java.io.Serializable; import java.util.Map; -import org.jasig.cas.authentication.principal.Principal; - /** * Interface to represent a successful response from the CAS Server. - * + * * @author Scott Battaglia * @version $Revision$ $Date$ * @since 3.0 @@ -21,7 +21,7 @@ public interface Assertion extends Serializable { /** * Method to retrieve the principal. - * + * * @return the principal. */ Principal getPrincipal(); @@ -30,14 +30,14 @@ public interface Assertion extends Serializable { * Map of attributes returned by the CAS server. A client must know what * attributes he is looking for as CAS makes no claims about what attributes * are returned. - * + * * @return the map of attributes. */ Map getAttributes(); /** * Method to retrieve the proxyGrantingTicket Id. - * + * * @return the ProxyGrantingTicket Id if one exists, otherwise null. */ String getProxyGrantingTicketId(); diff --git a/cas-client-core/src/main/java/org/jasig/cas/client/validation/AssertionImpl.java b/cas-client-core/src/main/java/org/jasig/cas/client/validation/AssertionImpl.java index 2e444db..acc23ea 100644 --- a/cas-client-core/src/main/java/org/jasig/cas/client/validation/AssertionImpl.java +++ b/cas-client-core/src/main/java/org/jasig/cas/client/validation/AssertionImpl.java @@ -13,14 +13,16 @@ import java.util.Map; /** * Concrete implementation of an Assertion. - * + * * @author Scott Battaglia * @version $Revision$ $Date$ * @since 3.0 */ public class AssertionImpl implements Assertion { - /** Unique id for serialization. */ + /** + * Unique id for serialization. + */ private static final long serialVersionUID = 1L; /** @@ -29,10 +31,14 @@ public class AssertionImpl implements Assertion { */ private final Map attributes; - /** The principal who was authenticated. */ + /** + * The principal who was authenticated. + */ private final Principal principal; - /** The Proxy Granting Ticket Id returned by the server. */ + /** + * The Proxy Granting Ticket Id returned by the server. + */ private final String proxyGrantingTicketId; public AssertionImpl(final Principal principal) { @@ -40,24 +46,24 @@ public class AssertionImpl implements Assertion { } public AssertionImpl(final Principal principal, final Map attributes, - final String proxyGrantingTicketId) { + final String proxyGrantingTicketId) { CommonUtils.assertNotNull(principal, "principal cannot be null"); this.principal = principal; this.attributes = attributes == null ? new HashMap() : attributes; this.proxyGrantingTicketId = CommonUtils - .isNotEmpty(proxyGrantingTicketId) ? proxyGrantingTicketId : null; + .isNotEmpty(proxyGrantingTicketId) ? proxyGrantingTicketId : null; } - public Map getAttributes() { + public final Map getAttributes() { return this.attributes; } - public Principal getPrincipal() { + public final Principal getPrincipal() { return this.principal; } - public String getProxyGrantingTicketId() { + public final String getProxyGrantingTicketId() { return this.proxyGrantingTicketId; } } diff --git a/cas-client-core/src/main/java/org/jasig/cas/client/validation/Cas10TicketValidator.java b/cas-client-core/src/main/java/org/jasig/cas/client/validation/Cas10TicketValidator.java index e45c0fa..3a003b9 100644 --- a/cas-client-core/src/main/java/org/jasig/cas/client/validation/Cas10TicketValidator.java +++ b/cas-client-core/src/main/java/org/jasig/cas/client/validation/Cas10TicketValidator.java @@ -5,40 +5,45 @@ */ package org.jasig.cas.client.validation; -import java.io.BufferedReader; -import java.io.IOException; -import java.io.StringReader; - +import org.apache.commons.httpclient.HttpClient; import org.jasig.cas.authentication.principal.Principal; import org.jasig.cas.authentication.principal.Service; import org.jasig.cas.authentication.principal.SimplePrincipal; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.StringReader; + /** * Implementation of TicketValidator that follows the CAS 1.0 protocol. - * + * * @author Scott Battaglia * @version $Revision$ $Date$ * @since 3.0 */ -public class Cas10TicketValidator extends AbstractUrlBasedTicketValidator { +public final class Cas10TicketValidator extends AbstractUrlBasedTicketValidator { + + public Cas10TicketValidator(final String casServerUrl, final boolean renew, final HttpClient httpClient) { + super(casServerUrl, renew, httpClient); + } protected String constructURL(final String ticketId, final Service service) { return getCasServerUrl() + "validate?ticket=" + ticketId - + (isRenew() ? "&renew=true" : "") + "&service=" - + getEncodedService(service); + + (isRenew() ? "&renew=true" : "") + "&service=" + + getEncodedService(service); } protected final Assertion parseResponse(final String response) - throws ValidationException { + throws ValidationException { if (response == null || "no\n\n".equals(response) - || !response.startsWith("yes")) { + || !response.startsWith("yes")) { throw new ValidationException( - "'No' response returned from server for validation request."); + "'No' response returned from server for validation request."); } try { final BufferedReader reader = new BufferedReader(new StringReader( - response)); + response)); reader.readLine(); final Principal principal = new SimplePrincipal(reader.readLine()); diff --git a/cas-client-core/src/main/java/org/jasig/cas/client/validation/Cas20ProxyTicketValidator.java b/cas-client-core/src/main/java/org/jasig/cas/client/validation/Cas20ProxyTicketValidator.java index 07f27fe..e8bf119 100644 --- a/cas-client-core/src/main/java/org/jasig/cas/client/validation/Cas20ProxyTicketValidator.java +++ b/cas-client-core/src/main/java/org/jasig/cas/client/validation/Cas20ProxyTicketValidator.java @@ -5,20 +5,27 @@ */ package org.jasig.cas.client.validation; +import org.apache.commons.httpclient.HttpClient; +import org.jasig.cas.authentication.principal.Service; +import org.jasig.cas.authentication.principal.SimpleService; +import org.jasig.cas.client.proxy.ProxyGrantingTicketStorage; +import org.jasig.cas.client.util.CommonUtils; +import org.jasig.cas.client.util.XmlUtils; + import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; import java.util.List; -import org.jasig.cas.authentication.principal.Service; -import org.jasig.cas.authentication.principal.SimpleService; -import org.jasig.cas.client.util.CommonUtils; -import org.jasig.cas.client.util.XmlUtils; - /** * Implementation of the TicketValidator interface that knows how to handle * proxy tickets. - * + * + * In your XML configuration file, proxy chains should be defined as + * follows: <list> <value> proxy1 proxy2 proxy3</value> + * <value> proxy2 proxy4 proxy5</value> <value> proxy4 + * proxy5 proxy6</value> </list> + * * @author Scott Battaglia * @version $Revision$ $Date$ * @since 3.0 @@ -26,17 +33,58 @@ import org.jasig.cas.client.util.XmlUtils; public class Cas20ProxyTicketValidator extends Cas20ServiceTicketValidator { /* List of proxy chains that we accept. */ - private List proxyChains; + private final List proxyChains; - /** Boolean whether we accept any proxy request or not. */ - private boolean acceptAnyProxy; + /** + * Boolean whether we accept any proxy request or not. + */ + private final boolean acceptAnyProxy; + + /** + * @param casServerUrl the url to the CAS server, minus the endpoint. + * @param renew flag for whether we require authentication to be via an initial authentication. + * @param httpClient an instance of HttpClient to do the calls. + * @param proxyGrantingTicketStorage a reference to the storage of the proxy tickets. + * @param proxyChains the chains of proxy lists that we accept tickets from. + * @param acceptAnyProxy flag on whether we accept any proxy or not. + */ + public Cas20ProxyTicketValidator(final String casServerUrl, final boolean renew, final HttpClient httpClient, final ProxyGrantingTicketStorage proxyGrantingTicketStorage, List proxyChains, boolean acceptAnyProxy) { + this(casServerUrl, renew, httpClient, null, proxyGrantingTicketStorage, proxyChains, acceptAnyProxy); + } + + public Cas20ProxyTicketValidator(final String casServerUrl, final boolean renew, final HttpClient httpClient, final Service proxyCallbackUrl, final ProxyGrantingTicketStorage proxyGrantingTicketStorage, List proxyChains, boolean acceptAnyProxy) { + super(casServerUrl, renew, httpClient, proxyCallbackUrl, proxyGrantingTicketStorage); + + CommonUtils.assertTrue(proxyChains != null || acceptAnyProxy, + "proxyChains cannot be null or acceptAnyProxy must be true."); + CommonUtils.assertTrue((proxyChains != null && !proxyChains + .isEmpty()) + || acceptAnyProxy, + "proxyChains cannot be empty or acceptAnyProxy must be true."); + + // assume each proxy chain has a length of 2 + final List tempProxyChains = new ArrayList(proxyChains.size() * 2); + for (final Iterator iter = proxyChains.iterator(); iter.hasNext();) { + final String[] values = ((String) iter.next()).split(" "); + final Service[] principals = new Service[values.length]; + + for (int i = 0; i < principals.length; i++) { + principals[i] = new SimpleService(values[i]); + } + + tempProxyChains.add(principals); + } + + this.proxyChains = tempProxyChains; + this.acceptAnyProxy = acceptAnyProxy; + } protected String getValidationUrlName() { return "proxyValidate"; } protected Assertion getValidAssertionInternal(final String response, - final Assertion assertion) throws ValidationException { + final Assertion assertion) throws ValidationException { final List proxies = XmlUtils.getTextForElements(response, "proxy"); final Service[] principals = new Service[proxies.size()]; @@ -63,53 +111,6 @@ public class Cas20ProxyTicketValidator extends Cas20ServiceTicketValidator { } return new AssertionImpl(assertion.getPrincipal(), assertion - .getAttributes(), assertion.getProxyGrantingTicketId()); - } - - /** - * In your XML configuration file, proxy chains should be defined as - * follows: <list> <value> proxy1 proxy2 proxy3</value> - * <value> proxy2 proxy4 proxy5</value> <value> proxy4 - * proxy5 proxy6</value> </list> - * - * @param proxyChains - */ - public final void setProxyChains(final List proxyChains) { - this.proxyChains = proxyChains; - } - - /** - * Set this flag to true if you don't care where the proxied request came - * from. - * - * @param acceptAnyProxy flag on whether we accept any proxy or not. - */ - public void setAcceptAnyProxy(final boolean acceptAnyProxy) { - this.acceptAnyProxy = acceptAnyProxy; - } - - protected void afterPropertiesSetInternal() { - super.afterPropertiesSetInternal(); - - CommonUtils.assertTrue(this.proxyChains != null || this.acceptAnyProxy, - "proxyChains cannot be null or acceptAnyProxy must be true."); - CommonUtils.assertTrue((this.proxyChains != null && !this.proxyChains - .isEmpty()) - || this.acceptAnyProxy, - "proxyChains cannot be empty or acceptAnyProxy must be true."); - - final List tempProxyChains = new ArrayList(); - for (final Iterator iter = this.proxyChains.iterator(); iter.hasNext();) { - final String[] values = ((String) iter.next()).split(" "); - final Service[] principals = new Service[values.length]; - - for (int i = 0; i < principals.length; i++) { - principals[i] = new SimpleService(values[i]); - } - - tempProxyChains.add(principals); - } - - this.proxyChains = tempProxyChains; + .getAttributes(), assertion.getProxyGrantingTicketId()); } } diff --git a/cas-client-core/src/main/java/org/jasig/cas/client/validation/Cas20ServiceTicketValidator.java b/cas-client-core/src/main/java/org/jasig/cas/client/validation/Cas20ServiceTicketValidator.java index a05c9b7..be83f95 100644 --- a/cas-client-core/src/main/java/org/jasig/cas/client/validation/Cas20ServiceTicketValidator.java +++ b/cas-client-core/src/main/java/org/jasig/cas/client/validation/Cas20ServiceTicketValidator.java @@ -5,9 +5,9 @@ */ package org.jasig.cas.client.validation; +import org.apache.commons.httpclient.HttpClient; import org.jasig.cas.authentication.principal.Service; import org.jasig.cas.authentication.principal.SimplePrincipal; -import org.jasig.cas.authentication.principal.SimpleService; import org.jasig.cas.client.proxy.ProxyGrantingTicketStorage; import org.jasig.cas.client.util.CommonUtils; import org.jasig.cas.client.util.XmlUtils; @@ -15,37 +15,53 @@ import org.jasig.cas.client.util.XmlUtils; /** * Implementation of TicketValidator that follows the CAS 2.0 protocol (without * proxying). - * + * * @author Scott Battaglia * @version $Revision$ $Date$ * @since 3.0 */ public class Cas20ServiceTicketValidator extends - AbstractUrlBasedTicketValidator { + AbstractUrlBasedTicketValidator { - /** Proxy callback url to send to the CAS server. */ - private Service proxyCallbackUrl; + /** + * Proxy callback url to send to the CAS server. + */ + private final Service proxyCallbackUrl; - /** The storage mechanism for the ProxyGrantingTickets. */ - private ProxyGrantingTicketStorage proxyGrantingTicketStorage; + /** + * The storage mechanism for the ProxyGrantingTickets. + */ + private final ProxyGrantingTicketStorage proxyGrantingTicketStorage; + + public Cas20ServiceTicketValidator(final String casServerUrl, final boolean renew, final HttpClient httpClient, final ProxyGrantingTicketStorage proxyGrantingTicketStorage) { + this(casServerUrl, renew, httpClient, null, proxyGrantingTicketStorage); + } + + public Cas20ServiceTicketValidator(final String casServerUrl, final boolean renew, final HttpClient httpClient, final Service proxyCallbackUrl, final ProxyGrantingTicketStorage proxyGrantingTicketStorage) { + super(casServerUrl, renew, httpClient); + CommonUtils.assertNotNull(proxyGrantingTicketStorage, + "proxyGrantingTicketStorage cannot be null"); + this.proxyCallbackUrl = proxyCallbackUrl; + this.proxyGrantingTicketStorage = proxyGrantingTicketStorage; + } protected String constructURL(final String ticketId, - final Service service) { + final Service service) { return getCasServerUrl() - + getValidationUrlName() - + "?ticket=" - + ticketId - + (isRenew() ? "&renew=true" : "") - + "&service=" - + getEncodedService(service) - + (this.proxyCallbackUrl != null ? "&pgtUrl=" + + getValidationUrlName() + + "?ticket=" + + ticketId + + (isRenew() ? "&renew=true" : "") + + "&service=" + + getEncodedService(service) + + (this.proxyCallbackUrl != null ? "&pgtUrl=" + getEncodedService(this.proxyCallbackUrl) : ""); } protected final Assertion parseResponse(String response) - throws ValidationException { + throws ValidationException { final String error = XmlUtils.getTextForElement(response, - "authenticationFailure"); + "authenticationFailure"); if (CommonUtils.isNotBlank(error)) { log.debug("Validation of ticket failed: " + error); @@ -54,7 +70,7 @@ public class Cas20ServiceTicketValidator extends final String principal = XmlUtils.getTextForElement(response, "user"); final String proxyGrantingTicketIou = XmlUtils.getTextForElement( - response, "proxyGrantingTicket"); + response, "proxyGrantingTicket"); if (CommonUtils.isEmpty(principal)) { throw new ValidationException("No principal found."); @@ -62,13 +78,13 @@ public class Cas20ServiceTicketValidator extends if (CommonUtils.isNotBlank(proxyGrantingTicketIou)) { return getValidAssertionInternal(response, new AssertionImpl( - new SimplePrincipal(principal), null, - this.proxyGrantingTicketStorage - .retrieve(proxyGrantingTicketIou))); + new SimplePrincipal(principal), null, + this.proxyGrantingTicketStorage + .retrieve(proxyGrantingTicketIou))); } return getValidAssertionInternal(response, new AssertionImpl( - new SimplePrincipal(principal))); + new SimplePrincipal(principal))); } protected String getValidationUrlName() { @@ -76,32 +92,7 @@ public class Cas20ServiceTicketValidator extends } protected Assertion getValidAssertionInternal(final String response, - final Assertion assertion) throws ValidationException { + final Assertion assertion) throws ValidationException { return assertion; } - - /** - * Sets the proxy callback url - * - * @param proxyCallbackUrl the proxycallback url specified for this - * application. - */ - public final void setProxyCallbackUrl(final String proxyCallbackUrl) { - this.proxyCallbackUrl = new SimpleService(proxyCallbackUrl); - } - - /** - * Sets the ProxyGrantingTicketStorage - * - * @param proxyGrantingTicketStorage the storage mechanism to use. - */ - public final void setProxyGrantingTicketStorage( - final ProxyGrantingTicketStorage proxyGrantingTicketStorage) { - this.proxyGrantingTicketStorage = proxyGrantingTicketStorage; - } - - protected void afterPropertiesSetInternal() { - CommonUtils.assertNotNull(this.proxyGrantingTicketStorage, - "proxyGrantingTicketStorage cannot be null"); - } } diff --git a/cas-client-core/src/main/java/org/jasig/cas/client/validation/InvalidProxyChainValidationException.java b/cas-client-core/src/main/java/org/jasig/cas/client/validation/InvalidProxyChainValidationException.java index 4ce7bd2..70dd317 100644 --- a/cas-client-core/src/main/java/org/jasig/cas/client/validation/InvalidProxyChainValidationException.java +++ b/cas-client-core/src/main/java/org/jasig/cas/client/validation/InvalidProxyChainValidationException.java @@ -8,29 +8,23 @@ package org.jasig.cas.client.validation; /** * Specific instance of a ValidationException that is thrown when the proxy * chain does not match what is returned. - * + * * @author Scott Battaglia * @version $Revision$ $Date$ * @since 3.0 */ public final class InvalidProxyChainValidationException extends ValidationException { - /** Unique id for serialization. */ + /** + * Unique id for serialization. + */ private static final long serialVersionUID = 1L; public InvalidProxyChainValidationException() { super(); } - public InvalidProxyChainValidationException(String message, Throwable cause) { - super(message, cause); - } - public InvalidProxyChainValidationException(String message) { super(message); } - - public InvalidProxyChainValidationException(Throwable cause) { - super(cause); - } } diff --git a/cas-client-core/src/main/java/org/jasig/cas/client/validation/TicketValidator.java b/cas-client-core/src/main/java/org/jasig/cas/client/validation/TicketValidator.java index 5eadddc..0e76218 100644 --- a/cas-client-core/src/main/java/org/jasig/cas/client/validation/TicketValidator.java +++ b/cas-client-core/src/main/java/org/jasig/cas/client/validation/TicketValidator.java @@ -11,7 +11,7 @@ import org.jasig.cas.authentication.principal.Service; * Interface to encapsulate the validation of a ticket. The inteface is * specification neutral. Any implementation can be provided, including * something that parses CAS1 or CAS2 responses. - * + * * @author Scott Battaglia * @version $Revision$ $Date$ * @since 3.0 @@ -20,12 +20,12 @@ public interface TicketValidator { /** * Method to validate a ticket for a give Service. - * + * * @param ticketId the ticket to validate - * @param service the service to validate the ticket for + * @param service the service to validate the ticket for * @return the Assertion about the ticket (never null) * @throws ValidationException if there is a problem validating the ticket. */ Assertion validate(String ticketId, Service service) - throws ValidationException; + throws ValidationException; } diff --git a/cas-client-core/src/main/java/org/jasig/cas/client/validation/ValidationException.java b/cas-client-core/src/main/java/org/jasig/cas/client/validation/ValidationException.java index ae17505..2a2741c 100644 --- a/cas-client-core/src/main/java/org/jasig/cas/client/validation/ValidationException.java +++ b/cas-client-core/src/main/java/org/jasig/cas/client/validation/ValidationException.java @@ -8,14 +8,16 @@ package org.jasig.cas.client.validation; /** * Implementation of Exception to be thrown when there is an error validating * the Ticket returned from the CAS server. - * + * * @author Scott Battaglia * @version $Revision$ $Date$ * @since 3.0 */ public class ValidationException extends Exception { - /** Unique Id for serialization. */ + /** + * Unique Id for serialization. + */ private static final long serialVersionUID = 1L; /** @@ -27,8 +29,9 @@ public class ValidationException extends Exception { /** * Constructor that accepts a message and a chained exception. + * * @param message the error message. - * @param cause the exception we are chaining with. + * @param cause the exception we are chaining with. */ public ValidationException(final String message, final Throwable cause) { super(message, cause); @@ -36,6 +39,7 @@ public class ValidationException extends Exception { /** * Constructor that accepts a message. + * * @param message the error message. */ public ValidationException(final String message) { @@ -44,6 +48,7 @@ public class ValidationException extends Exception { /** * Constructor that accepts a chained exception. + * * @param cause the exception we are chaining with. */ public ValidationException(final Throwable cause) { diff --git a/cas-client-core/src/main/java/org/jasig/cas/client/web/filter/AbstractCasFilter.java b/cas-client-core/src/main/java/org/jasig/cas/client/web/filter/AbstractCasFilter.java index e3eeae4..f4feddb 100644 --- a/cas-client-core/src/main/java/org/jasig/cas/client/web/filter/AbstractCasFilter.java +++ b/cas-client-core/src/main/java/org/jasig/cas/client/web/filter/AbstractCasFilter.java @@ -9,29 +9,26 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.jasig.cas.client.util.CommonUtils; -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; +import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; /** * Abstract class that contains common functionality amongst CAS filters. - *- * You must specify the serverName or the serviceUrl. If you specify both, the + *
+ * You must specify the serverName (format: hostname:port) or the serviceUrl. If you specify both, the * serviceUrl is used over the serverName. - * + * * @author Scott Battaglia * @version $Revision$ $Date$ * @since 3.0 */ public abstract class AbstractCasFilter implements Filter { - /** Constant string representing the ticket parameter. */ + /** + * Constant string representing the ticket parameter. + */ public static final String PARAM_TICKET = "ticket"; /** @@ -40,41 +37,66 @@ public abstract class AbstractCasFilter implements Filter { */ public static final String CONST_ASSERTION = "_cas_assertion_"; - /** Constant representing where we flag a gatewayed request in the session. */ + /** + * Constant representing where we flag a gatewayed request in the session. + */ public static final String CONST_GATEWAY = "_cas_gateway_"; - /** Constant representing where we flag a principal. */ + /** + * Constant representing where we flag a principal. + */ public static final String CONST_PRINCIPAL = "_cas_principal_"; - /** Instance of Commons Logging. */ + /** + * Instance of Commons Logging. + */ protected final Log log = LogFactory.getLog(this.getClass()); /** * The name of the server in the following format:+ *
* If a user is not authorized to use the application, the response code of 403 * will be sent to the browser. - *+ *
* This filter needs to be configured after both the authentication filter and * the validation filter. - * + * * @author Scott Battaglia * @version $Revision$ $Date$ - * @since 3.0 * @see CasAuthorizedDecider + * @since 3.0 */ public final class CasAuthorizationFilter implements Filter { @@ -38,34 +38,43 @@ public final class CasAuthorizationFilter implements Filter { * Decider that determines whether a specified principal has access to the * resource or not. */ - private CasAuthorizedDecider decider; + private final CasAuthorizedDecider decider; + + /** + * @param casAuthorizedDecider the thing actually deciding to grant access or not. + */ + public CasAuthorizationFilter(final CasAuthorizedDecider casAuthorizedDecider) { + CommonUtils.assertNotNull(casAuthorizedDecider, + "the casAuthorizedDecider cannot be null."); + this.decider = casAuthorizedDecider; + } public void destroy() { // nothing to do here } public void doFilter(final ServletRequest servletRequest, - final ServletResponse servletResponse, final FilterChain filterChain) - throws IOException, ServletException { + final ServletResponse servletResponse, final FilterChain filterChain) + throws IOException, ServletException { final HttpServletRequest request = (HttpServletRequest) servletRequest; final HttpServletResponse response = (HttpServletResponse) servletResponse; final Assertion assertion = (Assertion) request.getSession() - .getAttribute(AbstractCasFilter.CONST_ASSERTION); + .getAttribute(AbstractCasFilter.CONST_ASSERTION); if (assertion == null) { throw new ServletException( - "assertion session attribute expected but not found."); + "assertion session attribute expected but not found."); } final Principal principal = assertion.getPrincipal(); final boolean authorized = this.decider - .isAuthorizedToUseApplication(principal); + .isAuthorizedToUseApplication(principal); if (!authorized) { response.setStatus(HttpServletResponse.SC_FORBIDDEN); throw new AuthorizationException(principal.getId() - + " is not authorized to use this application."); + + " is not authorized to use this application."); } filterChain.doFilter(servletRequest, servletResponse); @@ -73,15 +82,5 @@ public final class CasAuthorizationFilter implements Filter { public void init(final FilterConfig filterConfig) throws ServletException { // nothing to do here - - } - - public void setDecider(final CasAuthorizedDecider decider) { - this.decider = decider; - } - - public void init() { - CommonUtils.assertNotNull(this.decider, - "the casAuthorizedDecider cannot be null."); } } diff --git a/cas-client-core/src/main/java/org/jasig/cas/client/web/filter/CasValidationFilter.java b/cas-client-core/src/main/java/org/jasig/cas/client/web/filter/CasValidationFilter.java index 799ddb5..9dd968c 100644 --- a/cas-client-core/src/main/java/org/jasig/cas/client/web/filter/CasValidationFilter.java +++ b/cas-client-core/src/main/java/org/jasig/cas/client/web/filter/CasValidationFilter.java @@ -22,30 +22,60 @@ import java.io.IOException; * will attempt to validate the ticket. On a successful validation, it sets the * Assertion object into the session. On an unsuccessful validation attempt, it * sets the response code to 403. - *+ *
* This filter needs to be configured after the authentication filter (if that * filter exists in the chain). - * + * * @author Scott Battaglia * @version $Revision$ $Date$ - * @since 3.0 * @see TicketValidator + * @since 3.0 */ public final class CasValidationFilter extends AbstractCasFilter { - /** Instance of the ticket validator. */ - private TicketValidator ticketValidator; + /** + * Instance of the ticket validator. + */ + private final TicketValidator ticketValidator; /** * Specify whether the filter should redirect the user agent after a * successful validation to remove the ticket parameter from the query * string. */ - private boolean redirectAfterValidation; + private final boolean redirectAfterValidation; - public void doFilterInternal(final HttpServletRequest request, - final HttpServletResponse response, final FilterChain filterChain) - throws IOException, ServletException { + /** + * Constructor that takes the severName (or serviceUrl) and the TicketValidator. Either serveName or serviceUrl is required (but not both). + * + * @param serverName the name of the server in+ *
* This filter needs to be configured in the chain so that it executes after * both the authentication and the validation filters. - * + * * @author Scott Battaglia * @version $Revision$ $Date$ * @since 3.0 @@ -44,22 +44,22 @@ public final class HttpServletRequestWrapperFilter implements Filter { * stored in the user session. */ public void doFilter(final ServletRequest servletRequest, - final ServletResponse servletResponse, final FilterChain filterChain) - throws IOException, ServletException { + final ServletResponse servletResponse, final FilterChain filterChain) + throws IOException, ServletException { filterChain.doFilter(new CasHttpServletRequestWrapper( - (HttpServletRequest) servletRequest), servletResponse); + (HttpServletRequest) servletRequest), servletResponse); } public void init(final FilterConfig filterConfig) throws ServletException { // nothing to do } - protected final class CasHttpServletRequestWrapper implements - HttpServletRequest { + final class CasHttpServletRequestWrapper implements + HttpServletRequest { private final HttpServletRequest request; - protected CasHttpServletRequestWrapper(final HttpServletRequest request) { + CasHttpServletRequestWrapper(final HttpServletRequest request) { this.request = request; } @@ -113,20 +113,20 @@ public final class HttpServletRequestWrapperFilter implements Filter { public String getRemoteUser() { final org.jasig.cas.authentication.principal.Principal p = (org.jasig.cas.authentication.principal.Principal) this.request - .getAttribute(AbstractCasFilter.CONST_PRINCIPAL); - + .getAttribute(AbstractCasFilter.CONST_PRINCIPAL); + if (p != null) { return p.getId(); } - + final Assertion assertion = (Assertion) WebUtils - .getSessionAttribute(this.request, - AbstractCasFilter.CONST_ASSERTION); - + .getSessionAttribute(this.request, + AbstractCasFilter.CONST_ASSERTION); + if (assertion != null) { return assertion.getPrincipal().getId(); } - + return null; } @@ -191,7 +191,7 @@ public final class HttpServletRequestWrapperFilter implements Filter { } public void setCharacterEncoding(String s) - throws UnsupportedEncodingException { + throws UnsupportedEncodingException { this.request.setCharacterEncoding(s); } diff --git a/cas-client-core/src/main/java/org/jasig/cas/client/web/filter/package.html b/cas-client-core/src/main/java/org/jasig/cas/client/web/filter/package.html index 7329dac..e567df0 100644 --- a/cas-client-core/src/main/java/org/jasig/cas/client/web/filter/package.html +++ b/cas-client-core/src/main/java/org/jasig/cas/client/web/filter/package.html @@ -1,5 +1,6 @@ -This package contains all of the useful filters related to normal CAS processing, including Authentication, Validation and Authorization.
+This package contains all of the useful filters related to normal CAS processing, including Authentication, + Validation and Authorization.
diff --git a/cas-client-core/src/main/resources/simpleFilterExample.xml b/cas-client-core/src/main/resources/simpleFilterExample.xml index 39c7690..8d8ee13 100644 --- a/cas-client-core/src/main/resources/simpleFilterExample.xml +++ b/cas-client-core/src/main/resources/simpleFilterExample.xml @@ -1,77 +1,72 @@DelegatingFilter
- *
+ *
* @author Scott Battaglia
* @version $Revision$ $Date$
* @since 3.0
*/
-public class DelegatingFilterTests extends TestCase {
+public final class DelegatingFilterTests extends TestCase {
private DelegatingFilter delegatingFilter;
@@ -33,12 +33,7 @@ public class DelegatingFilterTests extends TestCase {
delegators.put("1", new TestFilter(1));
this.filterExecuted = -1;
- this.delegatingFilter = new DelegatingFilter();
- this.delegatingFilter.setDefaultFilter(new TestFilter(0));
- this.delegatingFilter.setExactMatch(true);
- this.delegatingFilter.setDelegators(delegators);
- this.delegatingFilter.setRequestParameterName("test");
- this.delegatingFilter.init();
+ this.delegatingFilter = new DelegatingFilter("test", delegators, true, new TestFilter(0));
this.delegatingFilter.init(null);
}
@@ -51,7 +46,7 @@ public class DelegatingFilterTests extends TestCase {
request.addParameter("test", "1");
this.delegatingFilter.doFilter(request, new MockHttpServletResponse(),
- null);
+ null);
assertEquals(1, this.filterExecuted);
}
@@ -61,14 +56,14 @@ public class DelegatingFilterTests extends TestCase {
request.addParameter("test", "0");
this.delegatingFilter.doFilter(request, new MockHttpServletResponse(),
- null);
+ null);
assertEquals(0, this.filterExecuted);
}
public void testNoParam() throws Exception {
this.delegatingFilter.doFilter(new MockHttpServletRequest(),
- new MockHttpServletResponse(), null);
+ new MockHttpServletResponse(), null);
assertEquals(0, this.filterExecuted);
}
@@ -79,27 +74,27 @@ public class DelegatingFilterTests extends TestCase {
delegators.put("1.*", new TestFilter(1));
- this.delegatingFilter.setExactMatch(false);
- this.delegatingFilter.setDelegators(delegators);
+ this.delegatingFilter = new DelegatingFilter("test", delegators, false, new TestFilter(0));
+
MockHttpServletRequest request = new MockHttpServletRequest();
request.addParameter("test", "1");
this.delegatingFilter.doFilter(request, new MockHttpServletResponse(),
- null);
+ null);
assertEquals(1, this.filterExecuted);
request = new MockHttpServletRequest();
request.addParameter("test", "15");
this.delegatingFilter.doFilter(request, new MockHttpServletResponse(),
- null);
+ null);
assertEquals(1, this.filterExecuted);
request = new MockHttpServletRequest();
request.addParameter("test", "0");
this.delegatingFilter.doFilter(request, new MockHttpServletResponse(),
- null);
+ null);
assertEquals(0, this.filterExecuted);
}
@@ -108,17 +103,15 @@ public class DelegatingFilterTests extends TestCase {
Map map = new HashMap();
map.put("test", new Object());
- this.delegatingFilter.setDelegators(map);
-
try {
- this.delegatingFilter.init();
+ this.delegatingFilter = new DelegatingFilter("test", map, false, new TestFilter(0));
fail("Exception expected.");
} catch (IllegalArgumentException e) {
// expected
}
}
- private class TestFilter implements Filter {
+ private final class TestFilter implements Filter {
private final int i;
@@ -131,7 +124,7 @@ public class DelegatingFilterTests extends TestCase {
}
public void doFilter(ServletRequest arg0, ServletResponse arg1,
- FilterChain arg2) throws IOException, ServletException {
+ FilterChain arg2) throws IOException, ServletException {
DelegatingFilterTests.this.filterExecuted = this.i;
}
diff --git a/cas-client-core/src/test/java/org/jasig/cas/client/validation/AbstractTicketValidatorTests.java b/cas-client-core/src/test/java/org/jasig/cas/client/validation/AbstractTicketValidatorTests.java
index 2b5d242..a37e05e 100644
--- a/cas-client-core/src/test/java/org/jasig/cas/client/validation/AbstractTicketValidatorTests.java
+++ b/cas-client-core/src/test/java/org/jasig/cas/client/validation/AbstractTicketValidatorTests.java
@@ -9,7 +9,7 @@ import junit.framework.TestCase;
/**
* Base class for all TicketValidator tests to inherit from.
- *
+ *
* @author Scott Battaglia
* @version $Revision$ $Date$
* @since 3.0
diff --git a/cas-client-core/src/test/java/org/jasig/cas/client/validation/AssertionImplTests.java b/cas-client-core/src/test/java/org/jasig/cas/client/validation/AssertionImplTests.java
index 1b33057..8de22c0 100644
--- a/cas-client-core/src/test/java/org/jasig/cas/client/validation/AssertionImplTests.java
+++ b/cas-client-core/src/test/java/org/jasig/cas/client/validation/AssertionImplTests.java
@@ -14,7 +14,7 @@ import java.util.Map;
/**
* Test cases for the {@link AssertionImpl}.
- *
+ *
* @author Scott Battaglia
* @version $Revision$ $Date$
* @since 3.0
@@ -41,11 +41,11 @@ public final class AssertionImplTests extends TestCase {
public void testCompleteConstructor() {
final Assertion assertion = new AssertionImpl(CONST_PRINCIPAL,
- CONST_ATTRIBUTES, CONST_PROXY_GRANTING_TICKET_IOU);
+ CONST_ATTRIBUTES, CONST_PROXY_GRANTING_TICKET_IOU);
assertEquals(CONST_PRINCIPAL, assertion.getPrincipal());
assertEquals(CONST_ATTRIBUTES, assertion.getAttributes());
assertEquals(CONST_PROXY_GRANTING_TICKET_IOU, assertion
- .getProxyGrantingTicketId());
+ .getProxyGrantingTicketId());
}
}
diff --git a/cas-client-core/src/test/java/org/jasig/cas/client/validation/Cas10TicketValidatorTests.java b/cas-client-core/src/test/java/org/jasig/cas/client/validation/Cas10TicketValidatorTests.java
index 1604b75..4e7b76d 100644
--- a/cas-client-core/src/test/java/org/jasig/cas/client/validation/Cas10TicketValidatorTests.java
+++ b/cas-client-core/src/test/java/org/jasig/cas/client/validation/Cas10TicketValidatorTests.java
@@ -14,7 +14,7 @@ import java.io.UnsupportedEncodingException;
/**
* Test cases for the {@link Cas10TicketValidator}.
- *
+ *
* @author Scott Battaglia
* @version $Revision$ $Date$
* @since 3.0
@@ -28,19 +28,15 @@ public final class Cas10TicketValidatorTests extends AbstractTicketValidatorTest
}
protected void setUp() throws Exception {
- this.ticketValidator = new Cas10TicketValidator();
- this.ticketValidator.setCasServerUrl(CONST_CAS_SERVER_URL);
- this.ticketValidator.setRenew(true);
- this.ticketValidator.setHttpClient(new HttpClient());
- this.ticketValidator.init();
+ this.ticketValidator = new Cas10TicketValidator(CONST_CAS_SERVER_URL, true, new HttpClient());
}
public void testNoResponse() throws Exception {
PublicTestHttpServer.instance().content = "no\n\n"
- .getBytes(PublicTestHttpServer.instance().encoding);
+ .getBytes(PublicTestHttpServer.instance().encoding);
try {
this.ticketValidator.validate("testTicket", new SimpleService(
- "myService"));
+ "myService"));
fail("ValidationException expected.");
} catch (final ValidationException e) {
// expected
@@ -48,20 +44,20 @@ public final class Cas10TicketValidatorTests extends AbstractTicketValidatorTest
}
public void testYesResponse() throws ValidationException,
- UnsupportedEncodingException {
+ UnsupportedEncodingException {
PublicTestHttpServer.instance().content = "yes\nusername\n\n"
- .getBytes(PublicTestHttpServer.instance().encoding);
+ .getBytes(PublicTestHttpServer.instance().encoding);
final Assertion assertion = this.ticketValidator.validate("testTicket",
- new SimpleService("myService"));
+ new SimpleService("myService"));
assertEquals(CONST_USERNAME, assertion.getPrincipal().getId());
}
public void testBadResponse() throws UnsupportedEncodingException {
PublicTestHttpServer.instance().content = "falalala\n\n"
- .getBytes(PublicTestHttpServer.instance().encoding);
+ .getBytes(PublicTestHttpServer.instance().encoding);
try {
this.ticketValidator.validate("testTicket", new SimpleService(
- "myService"));
+ "myService"));
fail("ValidationException expected.");
} catch (final ValidationException e) {
// expected
diff --git a/cas-client-core/src/test/java/org/jasig/cas/client/validation/Cas20ProxyTicketValidatorTests.java b/cas-client-core/src/test/java/org/jasig/cas/client/validation/Cas20ProxyTicketValidatorTests.java
index 99e7129..dec5ac5 100644
--- a/cas-client-core/src/test/java/org/jasig/cas/client/validation/Cas20ProxyTicketValidatorTests.java
+++ b/cas-client-core/src/test/java/org/jasig/cas/client/validation/Cas20ProxyTicketValidatorTests.java
@@ -18,13 +18,13 @@ import java.util.List;
/**
* Test cases for the {@link Cas20ProxyTicketValidator}.
- *
+ *
* @author Scott Battaglia
* @version $Revision$ $Date$
* @since 3.0
*/
public final class Cas20ProxyTicketValidatorTests extends
- AbstractTicketValidatorTests {
+ AbstractTicketValidatorTests {
private Cas20ProxyTicketValidator ticketValidator;
@@ -33,46 +33,36 @@ public final class Cas20ProxyTicketValidatorTests extends
}
protected void setUp() throws Exception {
- ProxyGrantingTicketStorage proxyGrantingTicketStorage = getProxyGrantingTicketStorage();
- this.ticketValidator = new Cas20ProxyTicketValidator();
- this.ticketValidator.setCasServerUrl(CONST_CAS_SERVER_URL);
- this.ticketValidator.setRenew(true);
- this.ticketValidator
- .setProxyGrantingTicketStorage(proxyGrantingTicketStorage);
- this.ticketValidator.setHttpClient(new HttpClient());
-
+ final ProxyGrantingTicketStorage proxyGrantingTicketStorage = getProxyGrantingTicketStorage();
final List list = new ArrayList();
list.add("proxy1 proxy2 proxy3");
- this.ticketValidator.setProxyChains(list);
- this.ticketValidator.init();
+ this.ticketValidator = new Cas20ProxyTicketValidator(CONST_CAS_SERVER_URL, true, new HttpClient(), proxyGrantingTicketStorage, list, false);
}
- private ProxyGrantingTicketStorage getProxyGrantingTicketStorage()
- throws Exception {
+ private ProxyGrantingTicketStorage getProxyGrantingTicketStorage() {
ProxyGrantingTicketStorageImpl proxyGrantingTicketStorageImpl = new ProxyGrantingTicketStorageImpl();
- proxyGrantingTicketStorageImpl.init();
return proxyGrantingTicketStorageImpl;
}
public void testProxyChainWithValidProxy() throws ValidationException,
- UnsupportedEncodingException {
+ UnsupportedEncodingException {
final String USERNAME = "username";
final String RESPONSE = "CONST_CAS_TICKET_VALIDATOR.
*/
- protected TicketValidator ticketValidator;
+ protected final TicketValidator ticketValidator;
/**
* The ProxyRetriever referenced by the constant
* CONST_CAS_PROXY_RETRIEVER.
*/
- protected ProxyRetriever proxyRetriever;
+ protected final ProxyRetriever proxyRetriever;
- /** The Service referenced by the constant CONST_CAS_SERVICE. */
- protected Service service;
+ /**
+ * The Service referenced by the constant CONST_CAS_SERVICE.
+ */
+ protected final Service service;
/**
* Default constructor retrieves and caches results from looking up entries
@@ -63,18 +74,19 @@ public abstract class AbstractCasSecurityContextFactory extends
*/
public AbstractCasSecurityContextFactory() {
this.ticketValidator = (TicketValidator) PortalApplicationContextFacade
- .getPortalApplicationContext().getBean(CONST_CAS_TICKET_VALIDATOR);
+ .getPortalApplicationContext().getBean(CONST_CAS_TICKET_VALIDATOR);
if (PortalApplicationContextFacade.getPortalApplicationContext()
- .containsBean(CONST_CAS_PROXY_RETRIEVER)) {
+ .containsBean(CONST_CAS_PROXY_RETRIEVER)) {
this.proxyRetriever = (ProxyRetriever) PortalApplicationContextFacade
- .getPortalApplicationContext().getBean(
+ .getPortalApplicationContext().getBean(
CONST_CAS_PROXY_RETRIEVER);
} else {
+ this.proxyRetriever = null;
log
- .warn("No Proxy Retriever found in PortalApplicationFacade. No Proxying capabilities will be provided by CAS.");
+ .warn("No Proxy Retriever found in PortalApplicationFacade. No Proxying capabilities will be provided by CAS.");
}
this.service = (Service) PortalApplicationContextFacade
- .getPortalApplicationContext().getBean(CONST_CAS_SERVICE);
+ .getPortalApplicationContext().getBean(CONST_CAS_SERVICE);
}
-
+
}
diff --git a/cas-client-uportal/src/main/java/org/jasig/cas/client/integration/uportal/CasConnectionContext.java b/cas-client-uportal/src/main/java/org/jasig/cas/client/integration/uportal/CasConnectionContext.java
index 1dff5f7..7cbac4e 100644
--- a/cas-client-uportal/src/main/java/org/jasig/cas/client/integration/uportal/CasConnectionContext.java
+++ b/cas-client-uportal/src/main/java/org/jasig/cas/client/integration/uportal/CasConnectionContext.java
@@ -16,21 +16,23 @@ import java.util.Enumeration;
/**
* Extension to LocalConnectionContext that will retrieve and append a proxy
* ticket to a given descriptor.
- *
+ *
* @author Scott Battaglia
* @version $Revision$ $Date$
* @since 3.0
*/
public final class CasConnectionContext extends LocalConnectionContext {
- /** Instance of ICasSecurityContext. */
+ /**
+ * Instance of ICasSecurityContext.
+ */
private ICasSecurityContext casSecurityContext;
public String getDescriptor(String descriptor,
- final ChannelRuntimeData channelRuntimeData) {
+ final ChannelRuntimeData channelRuntimeData) {
if (log.isTraceEnabled()) {
log.trace("getDescriptor(" + descriptor + ", " + channelRuntimeData
- + ")");
+ + ")");
}
descriptor = descriptor == null ? "null" : descriptor;
@@ -39,11 +41,11 @@ public final class CasConnectionContext extends LocalConnectionContext {
if (this.casSecurityContext != null) {
final String proxyTicket = this.casSecurityContext
- .getProxyTicket(new SimpleService(descriptor));
+ .getProxyTicket(new SimpleService(descriptor));
if (proxyTicket != null) {
// append ticket parameter and value to query string
- if (descriptor.indexOf("?") != -1) {
+ if (descriptor.indexOf('?') != -1) {
descriptor = descriptor + "&ticket=" + proxyTicket;
} else {
descriptor = descriptor + "?ticket=" + proxyTicket;
@@ -57,11 +59,11 @@ public final class CasConnectionContext extends LocalConnectionContext {
public void init(final ChannelStaticData channelStaticData) {
final ISecurityContext securityContext = channelStaticData.getPerson()
- .getSecurityContext();
+ .getSecurityContext();
if (ICasSecurityContext.class.isAssignableFrom(securityContext
- .getClass())
- && securityContext.isAuthenticated()) {
+ .getClass())
+ && securityContext.isAuthenticated()) {
this.casSecurityContext = (ICasSecurityContext) securityContext;
}
@@ -69,10 +71,10 @@ public final class CasConnectionContext extends LocalConnectionContext {
while (enumeration.hasMoreElements()) {
final ISecurityContext context = (ISecurityContext) enumeration
- .nextElement();
+ .nextElement();
if (ISecurityContext.class.isAssignableFrom(context.getClass())
- && context.isAuthenticated()) {
+ && context.isAuthenticated()) {
this.casSecurityContext = (ICasSecurityContext) context;
}
}
diff --git a/cas-client-uportal/src/main/java/org/jasig/cas/client/integration/uportal/CasSecurityContext.java b/cas-client-uportal/src/main/java/org/jasig/cas/client/integration/uportal/CasSecurityContext.java
index 68728d3..e627b9d 100644
--- a/cas-client-uportal/src/main/java/org/jasig/cas/client/integration/uportal/CasSecurityContext.java
+++ b/cas-client-uportal/src/main/java/org/jasig/cas/client/integration/uportal/CasSecurityContext.java
@@ -17,32 +17,45 @@ import org.jasig.portal.security.provider.ChainingSecurityContext;
/**
* Implementation of ICasSecurityContext that knows how to handle CAS ticket
* validation, as well as the retrieval of Proxy Tickets.
- *
+ *
* @author Scott Battaglia
* @version $Revision$ $Date$
* @since 3.0
*/
public class CasSecurityContext extends ChainingSecurityContext implements
- ICasSecurityContext {
+ ICasSecurityContext {
- /** Unique Id for Serialization */
+ /**
+ * Unique Id for Serialization
+ */
private static final long serialVersionUID = 1L;
- /** Instance of TicketValidator to validate tickets. */
+ /**
+ * Instance of TicketValidator to validate tickets.
+ */
private final TicketValidator ticketValidator;
- /** Instance of ProxyRetriever to obtain proxy tickets. */
+ /**
+ * Instance of ProxyRetriever to obtain proxy tickets.
+ */
private final ProxyRetriever proxyRetriever;
- /** Instance of Service representing uPortal instance. */
+ /**
+ * Instance of Service representing uPortal instance.
+ */
private final Service service;
- /** Assertion about the person this security context is for. */
+ /**
+ * Assertion about the person this security context is for.
+ */
private Assertion assertion;
/**
* Instantiate a new CasSecurityContext, setting the required fields.
*
+ * @param ticketValidator the TicketValidator to validate tickets.
+ * @param service the Service representing the portal.
+ * @param proxyRetriever the ProxyRetriever to use to retrieve proxies.
*/
public CasSecurityContext(final TicketValidator ticketValidator, final Service service, final ProxyRetriever proxyRetriever
) {
@@ -55,14 +68,14 @@ public class CasSecurityContext extends ChainingSecurityContext implements
this.proxyRetriever = proxyRetriever;
}
- public final String getProxyTicket(final Service service) {
+ public final String getProxyTicket(final Service targetService) {
if (this.proxyRetriever == null
- || CommonUtils.isEmpty(this.assertion.getProxyGrantingTicketId())) {
+ || CommonUtils.isEmpty(this.assertion.getProxyGrantingTicketId())) {
return null;
}
return this.proxyRetriever.getProxyTicketIdFor(this.assertion
- .getProxyGrantingTicketId(), service);
+ .getProxyGrantingTicketId(), targetService);
}
public final int getAuthType() {
@@ -72,17 +85,17 @@ public class CasSecurityContext extends ChainingSecurityContext implements
public final synchronized void authenticate() throws PortalSecurityException {
this.isauth = false;
final String serviceTicket = new String(
- this.myOpaqueCredentials.credentialstring);
+ this.myOpaqueCredentials.credentialstring);
final Service service = getService();
if (log.isDebugEnabled()) {
log.debug("Attempting to validate ticket [" + serviceTicket
- + "] for service [" + service.toString());
+ + "] for service [" + service.toString());
}
try {
this.assertion = this.ticketValidator.validate(serviceTicket,
- service);
+ service);
this.myAdditionalDescriptor = null;
this.myPrincipal.setUID(this.assertion.getPrincipal().getId());
this.isauth = true;
@@ -92,7 +105,7 @@ public class CasSecurityContext extends ChainingSecurityContext implements
throw new PortalSecurityException(e.getMessage(), e);
}
}
-
+
protected Service getService() {
return this.service;
}
diff --git a/cas-client-uportal/src/main/java/org/jasig/cas/client/integration/uportal/CasSecurityContextFactory.java b/cas-client-uportal/src/main/java/org/jasig/cas/client/integration/uportal/CasSecurityContextFactory.java
index 29a4510..d47b8ca 100644
--- a/cas-client-uportal/src/main/java/org/jasig/cas/client/integration/uportal/CasSecurityContextFactory.java
+++ b/cas-client-uportal/src/main/java/org/jasig/cas/client/integration/uportal/CasSecurityContextFactory.java
@@ -12,7 +12,7 @@ import org.jasig.portal.security.ISecurityContextFactory;
* Implementation of an {@link ISecurityContextFactory} that on creation will
* retrieve references to Spring managed CAS client objects and pass them to all
* new CasSecurityContexts that are created.
- *
+ *
* @author Scott Battaglia
* @version $Revision$ $Date$
* @since 3.0
@@ -21,10 +21,12 @@ public final class CasSecurityContextFactory extends AbstractCasSecurityContextF
/**
* Instantiate a new instance of CasSecurityContext.
+ *
+ * @return a new ISecurityContext instance, specifically an instance of CasSecurityContext.
*/
public ISecurityContext getSecurityContext() {
log
- .trace("Returning CasSecurityContext from CasSecurityContextFactory.");
+ .trace("Returning CasSecurityContext from CasSecurityContextFactory.");
return new CasSecurityContext(this.ticketValidator, this.service, this.proxyRetriever
);
}
diff --git a/cas-client-uportal/src/main/java/org/jasig/cas/client/integration/uportal/ICasSecurityContext.java b/cas-client-uportal/src/main/java/org/jasig/cas/client/integration/uportal/ICasSecurityContext.java
index ba7dae9..566b178 100644
--- a/cas-client-uportal/src/main/java/org/jasig/cas/client/integration/uportal/ICasSecurityContext.java
+++ b/cas-client-uportal/src/main/java/org/jasig/cas/client/integration/uportal/ICasSecurityContext.java
@@ -11,18 +11,21 @@ import org.jasig.cas.authentication.principal.Service;
* Interface implemented by CAS security contexts. These implementations are
* aware of proxying, and can retrieve a ticket from CAS for accessing a
* specific service.
- *
+ *
* @author Scott Battaglia
* @version $Revision$ $Date$
* @since 3.0
*/
public interface ICasSecurityContext {
- /** Authentication type for CAS authentication */
+ /**
+ * Authentication type for CAS authentication
+ */
public static final int CAS_AUTHTYPE = 0x1701;
- /** Retrieve a Proxy Ticket Id for a particular service we wish to proxy against.
- *
+ /**
+ * Retrieve a Proxy Ticket Id for a particular service we wish to proxy against.
+ *
* @param service the service to retrieve a proxy ticket for.
* @return the ticket id, or null if no ticket could be retrieved.
*/
diff --git a/cas-client-uportal/src/main/java/org/jasig/cas/client/integration/uportal/ThreadLocalAwareCasSecurityContext.java b/cas-client-uportal/src/main/java/org/jasig/cas/client/integration/uportal/ThreadLocalAwareCasSecurityContext.java
index 437de4a..140bdc6 100644
--- a/cas-client-uportal/src/main/java/org/jasig/cas/client/integration/uportal/ThreadLocalAwareCasSecurityContext.java
+++ b/cas-client-uportal/src/main/java/org/jasig/cas/client/integration/uportal/ThreadLocalAwareCasSecurityContext.java
@@ -14,27 +14,29 @@ import org.jasig.cas.client.validation.TicketValidator;
* ServiceHolder ThreadLocal object. This allows for a more flexible service to
* be provided for ticket validation. This is needed as the normal
* ISecurityContext has no mechanism for service urls based on requests.
- *
+ *
* @author Scott Battaglia
* @version $Revision$ $Date$
* @since 3.0
*/
public final class ThreadLocalAwareCasSecurityContext extends
- CasSecurityContext {
+ CasSecurityContext {
- /** Unique Id for Serialization. */
+ /**
+ * Unique Id for Serialization.
+ */
private static final long serialVersionUID = 1L;
/**
* Instantiate a new CasSecurityContext, setting the required fields.
- *
+ *
* @param ticketValidator the Ticket Validator.
- * @param service the Service instance representing this uPortal instance.
- * @param proxyRetriever the object used to retrieve proxies.
+ * @param service the Service instance representing this uPortal instance.
+ * @param proxyRetriever the object used to retrieve proxies.
*/
public ThreadLocalAwareCasSecurityContext(
- final TicketValidator ticketValidator, final Service service,
- final ProxyRetriever proxyRetriever) {
+ final TicketValidator ticketValidator, final Service service,
+ final ProxyRetriever proxyRetriever) {
super(ticketValidator, service, proxyRetriever);
}
diff --git a/cas-client-uportal/src/main/java/org/jasig/cas/client/integration/uportal/ThreadLocalAwareCasSecurityContextFactory.java b/cas-client-uportal/src/main/java/org/jasig/cas/client/integration/uportal/ThreadLocalAwareCasSecurityContextFactory.java
index 24aae2b..56b2314 100644
--- a/cas-client-uportal/src/main/java/org/jasig/cas/client/integration/uportal/ThreadLocalAwareCasSecurityContextFactory.java
+++ b/cas-client-uportal/src/main/java/org/jasig/cas/client/integration/uportal/ThreadLocalAwareCasSecurityContextFactory.java
@@ -9,16 +9,16 @@ import org.jasig.portal.security.ISecurityContext;
/**
* Factory to instantiate ThreadLocalAwareCasSecurityContexts.
- *
+ *
* @author Scott Battaglia
* @version $Revision$ $Date$
* @since 3.0
*/
public final class ThreadLocalAwareCasSecurityContextFactory extends
- AbstractCasSecurityContextFactory {
+ AbstractCasSecurityContextFactory {
public ISecurityContext getSecurityContext() {
return new ThreadLocalAwareCasSecurityContext(this.ticketValidator,
- this.service, this.proxyRetriever);
+ this.service, this.proxyRetriever);
}
}
diff --git a/cas-client-uportal/src/main/java/org/jasig/cas/client/integration/uportal/ThreadLocalAwareCasServiceFilter.java b/cas-client-uportal/src/main/java/org/jasig/cas/client/integration/uportal/ThreadLocalAwareCasServiceFilter.java
index f20a934..875a1e7 100644
--- a/cas-client-uportal/src/main/java/org/jasig/cas/client/integration/uportal/ThreadLocalAwareCasServiceFilter.java
+++ b/cas-client-uportal/src/main/java/org/jasig/cas/client/integration/uportal/ThreadLocalAwareCasServiceFilter.java
@@ -22,22 +22,31 @@ import java.io.IOException;
* {@link ThreadLocalAwareCasSecurityContext} in order to use it for Ticket
* validation.
* This filter places the Service in a {@link ServiceHolder}.
- *
+ *
* @author Scott Battaglia
* @version $Revision$ $Date$
* @since 3.0
*/
public final class ThreadLocalAwareCasServiceFilter extends AbstractCasFilter {
+
+ public ThreadLocalAwareCasServiceFilter(final String serverName, final String serviceUrl) {
+ super(serverName, serviceUrl);
+ }
+
+ public ThreadLocalAwareCasServiceFilter(final String serverName, final String serviceUrl, final boolean useSession) {
+ super(serverName, serviceUrl, useSession);
+ }
+
protected void doFilterInternal(final HttpServletRequest request,
- final HttpServletResponse response, final FilterChain filterChain)
- throws IOException, ServletException {
+ final HttpServletResponse response, final FilterChain filterChain)
+ throws IOException, ServletException {
final boolean hasTicket = CommonUtils.isNotBlank(request
- .getParameter("ticket"));
+ .getParameter(AbstractCasFilter.PARAM_TICKET));
try {
if (hasTicket) {
final Service service = new SimpleService(constructServiceUrl(
- request, response));
+ request, response));
ServiceHolder.setService(service);
}
diff --git a/cas-client-uportal/src/main/java/org/jasig/cas/client/integration/uportal/UPortalConfiguredProxyReceptorServlet.java b/cas-client-uportal/src/main/java/org/jasig/cas/client/integration/uportal/UPortalConfiguredProxyReceptorServlet.java
index 3281922..ad1deb8 100644
--- a/cas-client-uportal/src/main/java/org/jasig/cas/client/integration/uportal/UPortalConfiguredProxyReceptorServlet.java
+++ b/cas-client-uportal/src/main/java/org/jasig/cas/client/integration/uportal/UPortalConfiguredProxyReceptorServlet.java
@@ -16,22 +16,24 @@ import javax.servlet.ServletException;
* Implementation of AbstractProxyReceptorServlet that retrieves the
* ProxyGrantingTicket storage from the Portal Application Context instead of a
* WebApplicationContext.
- *
+ *
* @author Scott Battaglia
* @version $Revision$ $Date$
* @since 3.0
*/
public final class UPortalConfiguredProxyReceptorServlet extends
- AbstractProxyReceptorServlet {
+ AbstractProxyReceptorServlet {
- /** Unique Id for Serialization. */
+ /**
+ * Unique Id for Serialization.
+ */
private static final long serialVersionUID = 6596608588362834646L;
public void init(final ServletConfig servletConfig) throws ServletException {
logger.info("Retrieving ProxyGrantingTicketStorage from PortalApplicationContextFacade.");
setProxyGrantingTicketStorage((ProxyGrantingTicketStorage) PortalApplicationContextFacade
- .getPortalApplicationContext()
- .getBean(
- AbstractCasSecurityContextFactory.CONST_CAS_PROXY_GRANTING_TICKET_STORAGE));
+ .getPortalApplicationContext()
+ .getBean(
+ AbstractCasSecurityContextFactory.CONST_CAS_PROXY_GRANTING_TICKET_STORAGE));
}
}
diff --git a/cas-client-uportal/src/main/resources/uportalCasConfigurationContext.xml b/cas-client-uportal/src/main/resources/uportalCasConfigurationContext.xml
index 98a413b..fc09c28 100644
--- a/cas-client-uportal/src/main/resources/uportalCasConfigurationContext.xml
+++ b/cas-client-uportal/src/main/resources/uportalCasConfigurationContext.xml
@@ -2,72 +2,65 @@
+
+