diff --git a/.github/renovate.json b/.github/renovate.json new file mode 100644 index 0000000..58fa77f --- /dev/null +++ b/.github/renovate.json @@ -0,0 +1,11 @@ +{ + "extends": [ + "config:base", + ":preserveSemverRanges", + ":rebaseStalePrs", + ":disableRateLimiting", + ":semanticCommits", + ":semanticCommitTypeAll(renovatebot)" + ], + "labels": ["dependencies", "bot"] +} diff --git a/.mergify.yml b/.mergify.yml new file mode 100644 index 0000000..89b9196 --- /dev/null +++ b/.mergify.yml @@ -0,0 +1,25 @@ +pull_request_rules: +- name: automatic merge by dependabot + conditions: + - status-success=continuous-integration/travis-ci/pr + - status-success=WIP + - "#changes-requested-reviews-by=0" + - base=master + - label=dependencies + actions: + merge: + method: merge + strict: true + delete_head_branch: +- name: automatic merge by renovate + conditions: + - status-success=continuous-integration/travis-ci/pr + - status-success=WIP + - "#changes-requested-reviews-by=0" + - base=master + - label=dependencies + actions: + merge: + method: merge + strict: true + delete_head_branch: diff --git a/README.md b/README.md index 03b62f4..03a63d2 100644 --- a/README.md +++ b/README.md @@ -62,7 +62,7 @@ files in the modules (`cas-client-integration-jboss` and `cas-client-support-dis ``` -- Atlassian integration is provided by this dependency: +- Atlassian integration (Deprecated) is provided by this dependency: ```xml @@ -122,6 +122,16 @@ files in the modules (`cas-client-integration-jboss` and `cas-client-support-dis ``` +- Spring Boot AutoConfiguration is provided by this dependency: + +```xml + + org.jasig.cas.client + cas-client-support-springboot + ${java.cas.client.version} + +``` + ## Configuration @@ -639,6 +649,106 @@ Configuration to accept Proxy Ticket from a chain (and Proxy Granting Tickets): The specific filters can be configured in the following ways. Please see the JavaDocs included in the distribution for specific required and optional properties: + +## Spring Boot AutoConfiguration + +### Usage + +* Define a dependency: + +> Maven: + +```xml + + org.jasig.cas.client + cas-client-support-springboot + ${java.cas.client.version} + +``` + +> Gradle: + +```groovy +dependencies { + ... + compile 'org.jasig.cas.client:cas-client-support-springboot:${java.cas.client.version}' + ... +} +``` + +* Add the following required properties in Spring Boot's `application.properties` or `application.yml`: + +```properties +cas.server-url-prefix=https://cashost.com/cas +cas.server-login-url=https://cashost.com/cas/login +cas.client-host-url=https://casclient.com +``` + +* Annotate Spring Boot application (or any @Configuration class) with `@EnableCasClient` annotation + +```java +@SpringBootApplication +@Controller +@EnableCasClient +public class MyApplication { .. } +``` + +> For CAS3 protocol (authentication and validation filters) - which is default if nothing is specified + +```properties +cas.validation-type=CAS3 +``` + +> For CAS2 protocol (authentication and validation filters) + +```properties +cas.validation-type=CAS +``` + +> For SAML protocol (authentication and validation filters) + +```properties +cas.validation-type=SAML +``` + +### Available optional properties + +* `cas.authentication-url-patterns` +* `cas.validation-url-patterns` +* `cas.request-wrapper-url-patterns` +* `cas.assertion-thread-local-url-patterns` +* `cas.gateway` +* `cas.use-session` +* `cas.redirect-after-validation` +* `cas.allowed-proxy-chains` +* `cas.proxy-callback-url` +* `cas.proxy-receptor-url` +* `cas.accept-any-proxy` +* `server.context-parameters.renew` + +### Advanced configuration + +This module does not expose ALL the CAS client configuration options via standard Spring property sources, but only most commonly used ones. +If there is a need however, to set any number of not exposed, 'exotic' properties, you can implement the `CasClientConfigurer` +class in your `@EnableCasClient` annotated class and override appropriate configuration method(s) for CAS client filter(s) in question. +For example: + +```java +@SpringBootApplication +@EnableCasClient +class CasProtectedApplication implements CasClientConfigurer { + @Override + void configureValidationFilter(FilterRegistrationBean validationFilter) { + validationFilter.getInitParameters().put("millisBetweenCleanUps", "120000"); + } + @Override + void configureAuthenticationFilter(FilterRegistrationBean authenticationFilter) { + authenticationFilter.getInitParameters().put("artifactParameterName", "casTicket"); + authenticationFilter.getInitParameters().put("serviceParameterName", "targetService"); + } +} +``` + ### Client Configuration Using JNDI @@ -870,7 +980,7 @@ If you have any trouble, you can enable the log of cas in `jboss-logging.xml` by -``` +``` ## Tomcat 6/7/8 Integration diff --git a/cas-client-core/pom.xml b/cas-client-core/pom.xml index 804644b..ff0e745 100644 --- a/cas-client-core/pom.xml +++ b/cas-client-core/pom.xml @@ -47,6 +47,12 @@ provided + + org.springframework + spring-web + provided + + org.springframework spring-test diff --git a/cas-client-core/src/main/java/org/jasig/cas/client/authentication/AttributePrincipalImpl.java b/cas-client-core/src/main/java/org/jasig/cas/client/authentication/AttributePrincipalImpl.java index 9230b56..30683a6 100644 --- a/cas-client-core/src/main/java/org/jasig/cas/client/authentication/AttributePrincipalImpl.java +++ b/cas-client-core/src/main/java/org/jasig/cas/client/authentication/AttributePrincipalImpl.java @@ -102,7 +102,7 @@ public class AttributePrincipalImpl extends SimplePrincipal implements Attribute } @Override - public String getProxyTicketFor(String service) { + public String getProxyTicketFor(final String service) { if (proxyGrantingTicket != null) { return this.proxyRetriever.getProxyTicketIdFor(this.proxyGrantingTicket, service); } diff --git a/cas-client-core/src/main/java/org/jasig/cas/client/authentication/AuthenticationFilter.java b/cas-client-core/src/main/java/org/jasig/cas/client/authentication/AuthenticationFilter.java index 2a2a1a3..3b77e47 100644 --- a/cas-client-core/src/main/java/org/jasig/cas/client/authentication/AuthenticationFilter.java +++ b/cas-client-core/src/main/java/org/jasig/cas/client/authentication/AuthenticationFilter.java @@ -105,7 +105,7 @@ public class AuthenticationFilter extends AbstractCasFilter { if (!isIgnoreInitConfiguration()) { super.initInternal(filterConfig); - String loginUrl = getString(ConfigurationKeys.CAS_SERVER_LOGIN_URL); + final String loginUrl = getString(ConfigurationKeys.CAS_SERVER_LOGIN_URL); if (loginUrl != null) { setCasServerLoginUrl(loginUrl); } else { @@ -154,7 +154,7 @@ public class AuthenticationFilter extends AbstractCasFilter { public void init() { super.init(); - String message = String.format( + final String message = String.format( "one of %s and %s must not be null.", ConfigurationKeys.CAS_SERVER_LOGIN_URL.getName(), ConfigurationKeys.CAS_SERVER_URL_PREFIX.getName()); diff --git a/cas-client-core/src/main/java/org/jasig/cas/client/configuration/LegacyConfigurationStrategyImpl.java b/cas-client-core/src/main/java/org/jasig/cas/client/configuration/LegacyConfigurationStrategyImpl.java index f69ed2c..f15120a 100644 --- a/cas-client-core/src/main/java/org/jasig/cas/client/configuration/LegacyConfigurationStrategyImpl.java +++ b/cas-client-core/src/main/java/org/jasig/cas/client/configuration/LegacyConfigurationStrategyImpl.java @@ -37,7 +37,7 @@ public final class LegacyConfigurationStrategyImpl extends BaseConfigurationStra private final JndiConfigurationStrategyImpl jndiConfigurationStrategy = new JndiConfigurationStrategyImpl(); @Override - public void init(FilterConfig filterConfig, Class filterClazz) { + public void init(final FilterConfig filterConfig, final Class filterClazz) { this.webXmlConfigurationStrategy.init(filterConfig, filterClazz); this.jndiConfigurationStrategy.init(filterConfig, filterClazz); } diff --git a/cas-client-core/src/main/java/org/jasig/cas/client/configuration/SystemPropertiesConfigurationStrategyImpl.java b/cas-client-core/src/main/java/org/jasig/cas/client/configuration/SystemPropertiesConfigurationStrategyImpl.java index 9792882..d14d168 100644 --- a/cas-client-core/src/main/java/org/jasig/cas/client/configuration/SystemPropertiesConfigurationStrategyImpl.java +++ b/cas-client-core/src/main/java/org/jasig/cas/client/configuration/SystemPropertiesConfigurationStrategyImpl.java @@ -30,11 +30,11 @@ import javax.servlet.FilterConfig; public class SystemPropertiesConfigurationStrategyImpl extends BaseConfigurationStrategy { @Override - public void init(FilterConfig filterConfig, Class filterClazz) { + public void init(final FilterConfig filterConfig, final Class filterClazz) { } @Override - protected String get(ConfigurationKey configurationKey) { + protected String get(final ConfigurationKey configurationKey) { return System.getProperty(configurationKey.getName()); } } diff --git a/cas-client-core/src/main/java/org/jasig/cas/client/jaas/TicketCredential.java b/cas-client-core/src/main/java/org/jasig/cas/client/jaas/TicketCredential.java index 2dae541..786ca96 100644 --- a/cas-client-core/src/main/java/org/jasig/cas/client/jaas/TicketCredential.java +++ b/cas-client-core/src/main/java/org/jasig/cas/client/jaas/TicketCredential.java @@ -53,7 +53,7 @@ public final class TicketCredential implements Principal { return this.ticket; } - public boolean equals(Object o) { + public boolean equals(final Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) diff --git a/cas-client-core/src/main/java/org/jasig/cas/client/session/HashMapBackedSessionMappingStorage.java b/cas-client-core/src/main/java/org/jasig/cas/client/session/HashMapBackedSessionMappingStorage.java index 57d25fa..d49a2ff 100644 --- a/cas-client-core/src/main/java/org/jasig/cas/client/session/HashMapBackedSessionMappingStorage.java +++ b/cas-client-core/src/main/java/org/jasig/cas/client/session/HashMapBackedSessionMappingStorage.java @@ -47,7 +47,7 @@ public final class HashMapBackedSessionMappingStorage implements SessionMappingS private final Logger logger = LoggerFactory.getLogger(getClass()); @Override - public synchronized void addSessionById(String mappingId, HttpSession session) { + public synchronized void addSessionById(final String mappingId, final HttpSession session) { ID_TO_SESSION_KEY_MAPPING.put(session.getId(), mappingId); MANAGED_SESSIONS.put(mappingId, session); @@ -71,7 +71,7 @@ public final class HashMapBackedSessionMappingStorage implements SessionMappingS } @Override - public synchronized HttpSession removeSessionByMappingId(String mappingId) { + public synchronized HttpSession removeSessionByMappingId(final String mappingId) { final HttpSession session = MANAGED_SESSIONS.get(mappingId); if (session != null) { diff --git a/cas-client-core/src/main/java/org/jasig/cas/client/session/SingleSignOutFilter.java b/cas-client-core/src/main/java/org/jasig/cas/client/session/SingleSignOutFilter.java index 84c6318..3ca05e0 100644 --- a/cas-client-core/src/main/java/org/jasig/cas/client/session/SingleSignOutFilter.java +++ b/cas-client-core/src/main/java/org/jasig/cas/client/session/SingleSignOutFilter.java @@ -68,7 +68,7 @@ public final class SingleSignOutFilter extends AbstractConfigurationFilter { HANDLER.setRelayStateParameterName(name); } - public void setLogoutCallbackPath(String logoutCallbackPath) { + public void setLogoutCallbackPath(final String logoutCallbackPath) { HANDLER.setLogoutCallbackPath(logoutCallbackPath); } diff --git a/cas-client-core/src/main/java/org/jasig/cas/client/session/SingleSignOutHandler.java b/cas-client-core/src/main/java/org/jasig/cas/client/session/SingleSignOutHandler.java index 683604a..562411c 100644 --- a/cas-client-core/src/main/java/org/jasig/cas/client/session/SingleSignOutHandler.java +++ b/cas-client-core/src/main/java/org/jasig/cas/client/session/SingleSignOutHandler.java @@ -103,7 +103,7 @@ public final class SingleSignOutHandler { /** * @param logoutCallbackPath The logout callback path configured at the CAS server. */ - public void setLogoutCallbackPath(String logoutCallbackPath) { + public void setLogoutCallbackPath(final String logoutCallbackPath) { this.logoutCallbackPath = logoutCallbackPath; } @@ -169,11 +169,11 @@ public final class SingleSignOutHandler { return false; } - private boolean pathEligibleForLogout(HttpServletRequest request) { + private boolean pathEligibleForLogout(final HttpServletRequest request) { return logoutCallbackPath == null || logoutCallbackPath.equals(getPath(request)); } - private String getPath(HttpServletRequest request) { + private String getPath(final HttpServletRequest request) { return request.getServletPath() + CommonUtils.nullToEmpty(request.getPathInfo()); } diff --git a/cas-client-core/src/main/java/org/jasig/cas/client/ssl/HttpsURLConnectionFactory.java b/cas-client-core/src/main/java/org/jasig/cas/client/ssl/HttpsURLConnectionFactory.java index 5a44c1b..228fa9e 100644 --- a/cas-client-core/src/main/java/org/jasig/cas/client/ssl/HttpsURLConnectionFactory.java +++ b/cas-client-core/src/main/java/org/jasig/cas/client/ssl/HttpsURLConnectionFactory.java @@ -149,7 +149,7 @@ public final class HttpsURLConnectionFactory implements HttpURLConnectionFactory } @Override - public boolean equals(Object o) { + public boolean equals(final Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; diff --git a/cas-client-core/src/main/java/org/jasig/cas/client/util/AbstractConfigurationFilter.java b/cas-client-core/src/main/java/org/jasig/cas/client/util/AbstractConfigurationFilter.java index 220efa5..29d66d7 100644 --- a/cas-client-core/src/main/java/org/jasig/cas/client/util/AbstractConfigurationFilter.java +++ b/cas-client-core/src/main/java/org/jasig/cas/client/util/AbstractConfigurationFilter.java @@ -46,7 +46,7 @@ public abstract class AbstractConfigurationFilter implements Filter { private ConfigurationStrategy configurationStrategy; @Override - public void init(FilterConfig filterConfig) throws ServletException { + public void init(final FilterConfig filterConfig) throws ServletException { final String configurationStrategyName = filterConfig.getServletContext().getInitParameter(CONFIGURATION_STRATEGY_KEY); this.configurationStrategy = ReflectUtils.newInstance(ConfigurationStrategyName.resolveToConfigurationStrategy(configurationStrategyName)); this.configurationStrategy.init(filterConfig, getClass()); 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 c704f5f..ba03de2 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 @@ -313,7 +313,7 @@ public final class CommonUtils { final URIBuilder builder; if (!serverName.startsWith("https://") && !serverName.startsWith("http://")) { - String scheme = request.isSecure() ? "https://" : "http://"; + final String scheme = request.isSecure() ? "https://" : "http://"; builder = new URIBuilder(scheme + serverName, encode); } else { builder = new URIBuilder(serverName, encode); @@ -328,13 +328,13 @@ public final class CommonUtils { final List serviceParameterNames = Arrays.asList(serviceParameterName.split(",")); if (!serviceParameterNames.isEmpty() && !originalRequestUrl.getQueryParams().isEmpty()) { for (final URIBuilder.BasicNameValuePair pair : originalRequestUrl.getQueryParams()) { - String name = pair.getName(); + final String name = pair.getName(); if (!name.equals(artifactParameterName) && !serviceParameterNames.contains(name)) { if (name.contains("&") || name.contains("=") ){ - URIBuilder encodedParamBuilder = new URIBuilder(); + final URIBuilder encodedParamBuilder = new URIBuilder(); encodedParamBuilder.setParameters(name); for (final URIBuilder.BasicNameValuePair pair2 :encodedParamBuilder.getQueryParams()){ - String name2 = pair2.getName(); + final String name2 = pair2.getName(); if (!name2.equals(artifactParameterName) && !serviceParameterNames.contains(name2)) { builder.addParameter(name2, pair2.getValue()); } @@ -708,7 +708,7 @@ public final class CommonUtils { * @param string a possibly null string * @return a non-null string */ - public static String nullToEmpty(String string) { + public static String nullToEmpty(final String string) { return string == null ? "" : string; } @@ -718,7 +718,7 @@ public final class CommonUtils { * @param uri a string that may or may not end with a slash * @return the same string, except with a slash suffix (if necessary). */ - public static String addTrailingSlash(String uri) { + public static String addTrailingSlash(final String uri) { return uri.endsWith("/") ? uri : uri + "/"; } } diff --git a/cas-client-core/src/main/java/org/jasig/cas/client/util/PrivateKeyUtils.java b/cas-client-core/src/main/java/org/jasig/cas/client/util/PrivateKeyUtils.java index 0bde4ea..7f63dee 100644 --- a/cas-client-core/src/main/java/org/jasig/cas/client/util/PrivateKeyUtils.java +++ b/cas-client-core/src/main/java/org/jasig/cas/client/util/PrivateKeyUtils.java @@ -29,7 +29,7 @@ public class PrivateKeyUtils { } public static PrivateKey createKey(final String path, final String algorithm) { - PrivateKey key = readPemPrivateKey(path); + final PrivateKey key = readPemPrivateKey(path); if (key == null) { return readDERPrivateKey(path, algorithm); } else { @@ -70,8 +70,8 @@ public class PrivateKeyUtils { FileInputStream fis = null; try { fis = new FileInputStream(file); - long byteLength = file.length(); - byte[] bytes = new byte[(int) byteLength]; + final long byteLength = file.length(); + final byte[] bytes = new byte[(int) byteLength]; fis.read(bytes, 0, (int) byteLength); final PKCS8EncodedKeySpec privSpec = new PKCS8EncodedKeySpec(bytes); final KeyFactory factory = KeyFactory.getInstance(algorithm); diff --git a/cas-client-core/src/main/java/org/jasig/cas/client/util/ReflectUtils.java b/cas-client-core/src/main/java/org/jasig/cas/client/util/ReflectUtils.java index 8759593..7e1f72d 100644 --- a/cas-client-core/src/main/java/org/jasig/cas/client/util/ReflectUtils.java +++ b/cas-client-core/src/main/java/org/jasig/cas/client/util/ReflectUtils.java @@ -164,7 +164,7 @@ public final class ReflectUtils { do { try { field = clazz.getDeclaredField(fieldName); - } catch (NoSuchFieldException e) { + } catch (final NoSuchFieldException e) { clazz = clazz.getSuperclass(); } } while (field == null && clazz != null); @@ -176,7 +176,7 @@ public final class ReflectUtils { field.setAccessible(true); } return field.get(target); - } catch (Exception e) { + } catch (final Exception e) { throw new IllegalArgumentException("Error getting field " + fieldName, e); } } diff --git a/cas-client-core/src/main/java/org/jasig/cas/client/util/ThreadLocalXPathExpression.java b/cas-client-core/src/main/java/org/jasig/cas/client/util/ThreadLocalXPathExpression.java index 2e2c9fe..e67aa13 100644 --- a/cas-client-core/src/main/java/org/jasig/cas/client/util/ThreadLocalXPathExpression.java +++ b/cas-client-core/src/main/java/org/jasig/cas/client/util/ThreadLocalXPathExpression.java @@ -102,7 +102,7 @@ public class ThreadLocalXPathExpression extends ThreadLocal imp final XPath xPath = XPathFactory.newInstance().newXPath(); xPath.setNamespaceContext(context); return xPath.compile(expression); - } catch (XPathExpressionException e) { + } catch (final XPathExpressionException e) { throw new IllegalArgumentException("Invalid XPath expression"); } } diff --git a/cas-client-core/src/main/java/org/jasig/cas/client/util/URIBuilder.java b/cas-client-core/src/main/java/org/jasig/cas/client/util/URIBuilder.java index 5e73dd1..bd8416d 100644 --- a/cas-client-core/src/main/java/org/jasig/cas/client/util/URIBuilder.java +++ b/cas-client-core/src/main/java/org/jasig/cas/client/util/URIBuilder.java @@ -86,7 +86,7 @@ public final class URIBuilder { } } - public URIBuilder(final String string, boolean encode) { + public URIBuilder(final String string, final boolean encode) { super(); try { setEncode(encode); @@ -252,7 +252,7 @@ public final class URIBuilder { return this.encode ? CommonUtils.urlEncode(fragment) : fragment; } - public URIBuilder setEncode(boolean encode) { + public URIBuilder setEncode(final boolean encode) { this.encode = encode; return this; } 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 74260e2..dba15eb 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 @@ -65,7 +65,7 @@ public final class XmlUtils { for (final Map.Entry entry : features.entrySet()) { try { factory.setFeature(entry.getKey(), entry.getValue()); - } catch (ParserConfigurationException e) { + } catch (final ParserConfigurationException e) { LOGGER.warn("Failed setting XML feature {}: {}", entry.getKey(), e); } } @@ -73,7 +73,7 @@ public final class XmlUtils { factory.setNamespaceAware(true); try { return factory.newDocumentBuilder().parse(new InputSource(new StringReader(xml))); - } catch (Exception e) { + } catch (final Exception e) { throw new RuntimeException("XML parsing error: " + e); } } @@ -136,7 +136,7 @@ public final class XmlUtils { } @Override - public void characters(char[] ch, int start, int length) throws SAXException { + public void characters(final char[] ch, final int start, final int length) throws SAXException { if (this.foundElement) { this.buffer.append(ch, start, length); } @@ -188,7 +188,7 @@ public final class XmlUtils { } @Override - public void characters(char[] ch, int start, int length) throws SAXException { + public void characters(final char[] ch, final int start, final int length) throws SAXException { if (this.foundElement) { builder.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 ce8e5f3..0216d69 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 @@ -126,7 +126,7 @@ public abstract class AbstractUrlBasedTicketValidator implements TicketValidator buffer.append(this.casServerUrlPrefix); buffer.append(suffix); - for (Map.Entry entry : urlParameters.entrySet()) { + for (final Map.Entry entry : urlParameters.entrySet()) { final String key = entry.getKey(); final String value = entry.getValue(); diff --git a/cas-client-core/src/main/java/org/jasig/cas/client/validation/Cas30ServiceTicketValidator.java b/cas-client-core/src/main/java/org/jasig/cas/client/validation/Cas30ServiceTicketValidator.java index 2759048..fa3f322 100644 --- a/cas-client-core/src/main/java/org/jasig/cas/client/validation/Cas30ServiceTicketValidator.java +++ b/cas-client-core/src/main/java/org/jasig/cas/client/validation/Cas30ServiceTicketValidator.java @@ -54,7 +54,7 @@ public class Cas30ServiceTicketValidator extends Cas20ServiceTicketValidator { * @return - Map of attributes */ @Override - protected Map extractCustomAttributes(String xml) { + protected Map extractCustomAttributes(final String xml) { final Document document = XmlUtils.newDocument(xml); // Check if attributes are inlined. If not return default super method results diff --git a/cas-client-core/src/test/java/org/jasig/cas/client/PublicTestHttpServer.java b/cas-client-core/src/test/java/org/jasig/cas/client/PublicTestHttpServer.java index b47c367..3cf608b 100644 --- a/cas-client-core/src/test/java/org/jasig/cas/client/PublicTestHttpServer.java +++ b/cas-client-core/src/test/java/org/jasig/cas/client/PublicTestHttpServer.java @@ -48,23 +48,23 @@ public final class PublicTestHttpServer extends Thread { private static final Map serverMap = new HashMap(); - private PublicTestHttpServer(String data, String encoding, String MIMEType, int port) + private PublicTestHttpServer(final String data, final String encoding, final String MIMEType, final int port) throws UnsupportedEncodingException { this(data.getBytes(encoding), encoding, MIMEType, port); } - private PublicTestHttpServer(byte[] data, String encoding, String MIMEType, int port) + private PublicTestHttpServer(final byte[] data, final String encoding, final String MIMEType, final int port) throws UnsupportedEncodingException { this.content = data; this.port = port; this.encoding = encoding; - String header = "HTTP/1.0 200 OK\r\n" + "Server: OneFile 1.0\r\n" + "Content-type: " + MIMEType + "\r\n\r\n"; + final String header = "HTTP/1.0 200 OK\r\n" + "Server: OneFile 1.0\r\n" + "Content-type: " + MIMEType + "\r\n\r\n"; this.header = header.getBytes("ASCII"); } public static synchronized PublicTestHttpServer instance(final int port) { if (serverMap.containsKey(port)) { - PublicTestHttpServer server = serverMap.get(port); + final PublicTestHttpServer server = serverMap.get(port); server.waitUntilReady(); return server; } @@ -75,7 +75,7 @@ public final class PublicTestHttpServer extends Thread { serverMap.put(port, server); server.waitUntilReady(); return server; - } catch (Exception e) { + } catch (final Exception e) { throw new RuntimeException(e); } } @@ -83,7 +83,7 @@ public final class PublicTestHttpServer extends Thread { private void waitUntilReady() { try { ready.await(10, TimeUnit.SECONDS); - } catch (InterruptedException e) { + } catch (final InterruptedException e) { Thread.currentThread().interrupt(); throw new RuntimeException("interrupted", e); } @@ -117,7 +117,7 @@ public final class PublicTestHttpServer extends Thread { // read the first line only; that's all we need final StringBuffer request = new StringBuffer(80); while (true) { - int c = in.read(); + final int c = in.read(); if (c == '\r' || c == '\n' || c == -1) break; request.append((char) c); diff --git a/cas-client-core/src/test/java/org/jasig/cas/client/SerializationTests.java b/cas-client-core/src/test/java/org/jasig/cas/client/SerializationTests.java index 18a6e9c..c3adf4c 100644 --- a/cas-client-core/src/test/java/org/jasig/cas/client/SerializationTests.java +++ b/cas-client-core/src/test/java/org/jasig/cas/client/SerializationTests.java @@ -49,7 +49,7 @@ public class SerializationTests extends TestCase { final ObjectOutputStream out = new ObjectOutputStream(byteOut); try { out.writeObject(subjects[i]); - } catch (Exception e) { + } catch (final Exception e) { Assert.fail("Serialization failed for " + subjects[i]); } finally { out.close(); @@ -59,7 +59,7 @@ public class SerializationTests extends TestCase { final ObjectInputStream in = new ObjectInputStream(byteIn); try { Assert.assertEquals(subjects[i], in.readObject()); - } catch (Exception e) { + } catch (final Exception e) { Assert.fail("Deserialization failed for " + subjects[i]); } finally { in.close(); diff --git a/cas-client-core/src/test/java/org/jasig/cas/client/authentication/AuthenticationFilterTests.java b/cas-client-core/src/test/java/org/jasig/cas/client/authentication/AuthenticationFilterTests.java index cfe4cb2..2db4c14 100644 --- a/cas-client-core/src/test/java/org/jasig/cas/client/authentication/AuthenticationFilterTests.java +++ b/cas-client-core/src/test/java/org/jasig/cas/client/authentication/AuthenticationFilterTests.java @@ -95,7 +95,7 @@ public final class AuthenticationFilterTests { final FilterChain filterChain = new FilterChain() { @Override - public void doFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException { + public void doFilter(final ServletRequest request, final ServletResponse response) throws IOException, ServletException { // nothing to do } }; @@ -118,7 +118,7 @@ public final class AuthenticationFilterTests { final FilterChain filterChain = new FilterChain() { @Override - public void doFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException { + public void doFilter(final ServletRequest request, final ServletResponse response) throws IOException, ServletException { // nothing to do } }; @@ -149,7 +149,7 @@ public final class AuthenticationFilterTests { final FilterChain filterChain = new FilterChain() { @Override - public void doFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException { + public void doFilter(final ServletRequest request, final ServletResponse response) throws IOException, ServletException { // nothing to do } }; @@ -169,7 +169,7 @@ public final class AuthenticationFilterTests { final FilterChain filterChain = new FilterChain() { @Override - public void doFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException { + public void doFilter(final ServletRequest request, final ServletResponse response) throws IOException, ServletException { // nothing to do } }; @@ -190,7 +190,7 @@ public final class AuthenticationFilterTests { final FilterChain filterChain = new FilterChain() { @Override - public void doFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException { + public void doFilter(final ServletRequest request, final ServletResponse response) throws IOException, ServletException { // nothing to do } }; @@ -273,7 +273,7 @@ public final class AuthenticationFilterTests { final FilterChain filterChain = new FilterChain() { @Override - public void doFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException { + public void doFilter(final ServletRequest request, final ServletResponse response) throws IOException, ServletException { } }; @@ -303,7 +303,7 @@ public final class AuthenticationFilterTests { final FilterChain filterChain = new FilterChain() { @Override - public void doFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException { + public void doFilter(final ServletRequest request, final ServletResponse response) throws IOException, ServletException { } }; @@ -338,7 +338,7 @@ public final class AuthenticationFilterTests { final FilterChain filterChain = new FilterChain() { @Override - public void doFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException { + public void doFilter(final ServletRequest request, final ServletResponse response) throws IOException, ServletException { } }; @@ -368,7 +368,7 @@ public final class AuthenticationFilterTests { final FilterChain filterChain = new FilterChain() { @Override - public void doFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException { + public void doFilter(final ServletRequest request, final ServletResponse response) throws IOException, ServletException { } }; @@ -398,7 +398,7 @@ public final class AuthenticationFilterTests { final FilterChain filterChain = new FilterChain() { @Override - public void doFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException { + public void doFilter(final ServletRequest request, final ServletResponse response) throws IOException, ServletException { } }; diff --git a/cas-client-core/src/test/java/org/jasig/cas/client/configuration/ConfigurationStrategyNameTests.java b/cas-client-core/src/test/java/org/jasig/cas/client/configuration/ConfigurationStrategyNameTests.java index b8aba11..950b035 100644 --- a/cas-client-core/src/test/java/org/jasig/cas/client/configuration/ConfigurationStrategyNameTests.java +++ b/cas-client-core/src/test/java/org/jasig/cas/client/configuration/ConfigurationStrategyNameTests.java @@ -46,12 +46,12 @@ public final class ConfigurationStrategyNameTests { private class TestClass extends BaseConfigurationStrategy { @Override - protected String get(ConfigurationKey configurationKey) { + protected String get(final ConfigurationKey configurationKey) { return null; } @Override - public void init(FilterConfig filterConfig, Class filterClazz) { + public void init(final FilterConfig filterConfig, final Class filterClazz) { } } diff --git a/cas-client-core/src/test/java/org/jasig/cas/client/jaas/CasLoginModuleTests.java b/cas-client-core/src/test/java/org/jasig/cas/client/jaas/CasLoginModuleTests.java index d255f39..149b659 100644 --- a/cas-client-core/src/test/java/org/jasig/cas/client/jaas/CasLoginModuleTests.java +++ b/cas-client-core/src/test/java/org/jasig/cas/client/jaas/CasLoginModuleTests.java @@ -117,7 +117,7 @@ public class CasLoginModuleTests { try { module.login(); fail("Login did not throw FailedLoginException as expected."); - } catch (LoginException e) { + } catch (final LoginException e) { assertEquals(TicketValidationException.class, e.getCause().getClass()); } module.commit(); @@ -181,7 +181,7 @@ public class CasLoginModuleTests { module.login(); module.commit(); Assert.fail("Login should have failed."); - } catch (LoginException e) { + } catch (final LoginException e) { assertEquals(TicketValidationException.class, e.getCause().getClass()); } assertEquals(0, this.subject.getPrincipals().size()); @@ -229,7 +229,7 @@ public class CasLoginModuleTests { try { module.login(); fail("Should have thrown FailedLoginException."); - } catch (LoginException e) { + } catch (final LoginException e) { assertEquals(TicketValidationException.class, e.getCause().getClass()); } } @@ -237,7 +237,7 @@ public class CasLoginModuleTests { private boolean hasPrincipalName(final Subject subject, final Class principalClass, final String name) { final Set principals = subject.getPrincipals(principalClass); - for (Principal p : principals) { + for (final Principal p : principals) { if (p.getName().equals(name)) { return true; } diff --git a/cas-client-core/src/test/java/org/jasig/cas/client/proxy/CleanUpTimerTaskTest.java b/cas-client-core/src/test/java/org/jasig/cas/client/proxy/CleanUpTimerTaskTest.java index 31eb233..637d4a0 100644 --- a/cas-client-core/src/test/java/org/jasig/cas/client/proxy/CleanUpTimerTaskTest.java +++ b/cas-client-core/src/test/java/org/jasig/cas/client/proxy/CleanUpTimerTaskTest.java @@ -57,12 +57,12 @@ public class CleanUpTimerTaskTest extends TestCase { } @Override - public String retrieve(String proxyGrantingTicketIou) { + public String retrieve(final String proxyGrantingTicketIou) { return null; } @Override - public void save(String proxyGrantingTicketIou, String proxyGrantingTicket) { + public void save(final String proxyGrantingTicketIou, final String proxyGrantingTicket) { } } } diff --git a/cas-client-core/src/test/java/org/jasig/cas/client/proxy/ProxyGrantingTicketStorageImplTest.java b/cas-client-core/src/test/java/org/jasig/cas/client/proxy/ProxyGrantingTicketStorageImplTest.java index 03cfdd0..c1f7366 100644 --- a/cas-client-core/src/test/java/org/jasig/cas/client/proxy/ProxyGrantingTicketStorageImplTest.java +++ b/cas-client-core/src/test/java/org/jasig/cas/client/proxy/ProxyGrantingTicketStorageImplTest.java @@ -34,9 +34,9 @@ public class ProxyGrantingTicketStorageImplTest { @Test public void cleanUp() throws Exception { - String proxyGrantingTicketIou = "proxyGrantingTicketIou"; + final String proxyGrantingTicketIou = "proxyGrantingTicketIou"; - int timeout = 250; + final int timeout = 250; this.storage.save(proxyGrantingTicketIou, "proxyGrantingTicket"); // sleep long enough for the ticket to timeout diff --git a/cas-client-core/src/test/java/org/jasig/cas/client/util/CasFilterTests.java b/cas-client-core/src/test/java/org/jasig/cas/client/util/CasFilterTests.java index bc5c10d..f6bfb9a 100644 --- a/cas-client-core/src/test/java/org/jasig/cas/client/util/CasFilterTests.java +++ b/cas-client-core/src/test/java/org/jasig/cas/client/util/CasFilterTests.java @@ -62,7 +62,7 @@ public final class CasFilterTests { super(Protocol.CAS2); } @Override - public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, + public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain) throws IOException, ServletException { // nothing to do } diff --git a/cas-client-core/src/test/java/org/jasig/cas/client/util/CommonUtilsTests.java b/cas-client-core/src/test/java/org/jasig/cas/client/util/CommonUtilsTests.java index e44a882..c355626 100644 --- a/cas-client-core/src/test/java/org/jasig/cas/client/util/CommonUtilsTests.java +++ b/cas-client-core/src/test/java/org/jasig/cas/client/util/CommonUtilsTests.java @@ -69,7 +69,7 @@ public final class CommonUtilsTests extends TestCase { CommonUtils.assertNotNull(new Object(), CONST_MESSAGE); try { CommonUtils.assertNotNull(null, CONST_MESSAGE); - } catch (IllegalArgumentException e) { + } catch (final IllegalArgumentException e) { assertEquals(CONST_MESSAGE, e.getMessage()); } } @@ -81,13 +81,13 @@ public final class CommonUtilsTests extends TestCase { CommonUtils.assertNotEmpty(c, CONST_MESSAGE); try { CommonUtils.assertNotEmpty(new ArrayList(), CONST_MESSAGE); - } catch (IllegalArgumentException e) { + } catch (final IllegalArgumentException e) { assertEquals(CONST_MESSAGE, e.getMessage()); } try { CommonUtils.assertNotEmpty(null, CONST_MESSAGE); - } catch (IllegalArgumentException e) { + } catch (final IllegalArgumentException e) { assertEquals(CONST_MESSAGE, e.getMessage()); } } @@ -97,7 +97,7 @@ public final class CommonUtilsTests extends TestCase { CommonUtils.assertTrue(true, CONST_MESSAGE); try { CommonUtils.assertTrue(false, CONST_MESSAGE); - } catch (IllegalArgumentException e) { + } catch (final IllegalArgumentException e) { assertEquals(CONST_MESSAGE, e.getMessage()); } } diff --git a/cas-client-core/src/test/java/org/jasig/cas/client/util/HttpServletRequestWrapperFilterTests.java b/cas-client-core/src/test/java/org/jasig/cas/client/util/HttpServletRequestWrapperFilterTests.java index 312259d..4488ec7 100644 --- a/cas-client-core/src/test/java/org/jasig/cas/client/util/HttpServletRequestWrapperFilterTests.java +++ b/cas-client-core/src/test/java/org/jasig/cas/client/util/HttpServletRequestWrapperFilterTests.java @@ -120,7 +120,7 @@ public final class HttpServletRequestWrapperFilterTests extends TestCase { private FilterChain createFilterChain() { return new FilterChain() { @Override - public void doFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException { + public void doFilter(final ServletRequest request, final ServletResponse response) throws IOException, ServletException { HttpServletRequestWrapperFilterTests.this.mockRequest = (HttpServletRequest) request; } diff --git a/cas-client-core/src/test/java/org/jasig/cas/client/util/ReflectUtilsTests.java b/cas-client-core/src/test/java/org/jasig/cas/client/util/ReflectUtilsTests.java index 57d741c..c9a0733 100644 --- a/cas-client-core/src/test/java/org/jasig/cas/client/util/ReflectUtilsTests.java +++ b/cas-client-core/src/test/java/org/jasig/cas/client/util/ReflectUtilsTests.java @@ -81,7 +81,7 @@ public class ReflectUtilsTests extends TestCase { /** * @param count the count to set */ - public void setCount(int count) { + public void setCount(final int count) { this.count = count; } @@ -95,7 +95,7 @@ public class ReflectUtilsTests extends TestCase { /** * @param name the name to set */ - public void setName(String name) { + public void setName(final String name) { this.name = name; } @@ -109,7 +109,7 @@ public class ReflectUtilsTests extends TestCase { /** * @param flag the flag to set */ - public void setFlag(boolean flag) { + public void setFlag(final boolean flag) { this.flag = flag; } @@ -122,7 +122,7 @@ public class ReflectUtilsTests extends TestCase { return state; } - public void setState(String state) { + public void setState(final String state) { this.state = state; } } diff --git a/cas-client-core/src/test/java/org/jasig/cas/client/util/URIBuilderTests.java b/cas-client-core/src/test/java/org/jasig/cas/client/util/URIBuilderTests.java index 9dd2d05..f059a16 100644 --- a/cas-client-core/src/test/java/org/jasig/cas/client/util/URIBuilderTests.java +++ b/cas-client-core/src/test/java/org/jasig/cas/client/util/URIBuilderTests.java @@ -54,7 +54,7 @@ public class URIBuilderTests { @Test public void allPartsUsed() { - URIBuilder builder = new URIBuilder() + final URIBuilder builder = new URIBuilder() .setScheme("http") .setHost("apache.org") .setPath("/shindig") @@ -65,7 +65,7 @@ public class URIBuilderTests { @Test public void noSchemeUsed() { - URIBuilder builder = new URIBuilder() + final URIBuilder builder = new URIBuilder() .setHost("apache.org") .setPath("/shindig") .setCustomQuery("hello=world") @@ -75,7 +75,7 @@ public class URIBuilderTests { @Test public void noAuthorityUsed() { - URIBuilder builder = new URIBuilder() + final URIBuilder builder = new URIBuilder() .setScheme("http") .setPath("/shindig") .setCustomQuery("hello=world") @@ -85,7 +85,7 @@ public class URIBuilderTests { @Test public void noPathUsed() { - URIBuilder builder = new URIBuilder() + final URIBuilder builder = new URIBuilder() .setScheme("http") .setHost("apache.org") .setCustomQuery("hello=world") @@ -95,7 +95,7 @@ public class URIBuilderTests { @Test public void noQueryUsed() { - URIBuilder builder = new URIBuilder() + final URIBuilder builder = new URIBuilder() .setScheme("http") .setHost("apache.org") .setPath("/shindig") @@ -105,7 +105,7 @@ public class URIBuilderTests { @Test public void noFragmentUsed() { - URIBuilder builder = new URIBuilder() + final URIBuilder builder = new URIBuilder() .setScheme("http") .setHost("apache.org") .setPath("/shindig") @@ -115,7 +115,7 @@ public class URIBuilderTests { @Test public void hostRelativePaths() { - URIBuilder builder = new URIBuilder() + final URIBuilder builder = new URIBuilder() .setPath("/shindig") .setCustomQuery("hello=world") .setFragment("foo"); @@ -124,7 +124,7 @@ public class URIBuilderTests { @Test public void relativePaths() { - URIBuilder builder = new URIBuilder() + final URIBuilder builder = new URIBuilder() .setPath("foo") .setCustomQuery("hello=world") .setFragment("foo"); @@ -133,7 +133,7 @@ public class URIBuilderTests { @Test public void noPathNoHostNoAuthority() { - URIBuilder builder = new URIBuilder() + final URIBuilder builder = new URIBuilder() .setCustomQuery("hello=world") .setFragment("foo"); assertEquals("?hello=world#foo", builder.toString()); @@ -141,7 +141,7 @@ public class URIBuilderTests { @Test public void justSchemeAndAuthority() { - URIBuilder builder = new URIBuilder() + final URIBuilder builder = new URIBuilder() .setScheme("http") .setHost("apache.org"); assertEquals("http://apache.org", builder.toString()); @@ -149,14 +149,14 @@ public class URIBuilderTests { @Test public void justPath() { - URIBuilder builder = new URIBuilder() + final URIBuilder builder = new URIBuilder() .setPath("/shindig"); assertEquals("/shindig", builder.toString()); } @Test public void justAuthorityAndPath() { - URIBuilder builder = new URIBuilder() + final URIBuilder builder = new URIBuilder() .setHost("apache.org") .setPath("/shindig"); assertEquals("//apache.org/shindig", builder.toString()); @@ -164,21 +164,21 @@ public class URIBuilderTests { @Test public void justQuery() { - URIBuilder builder = new URIBuilder() + final URIBuilder builder = new URIBuilder() .setCustomQuery("hello=world"); assertEquals("?hello=world", builder.toString()); } @Test public void justFragment() { - URIBuilder builder = new URIBuilder() + final URIBuilder builder = new URIBuilder() .setFragment("foo"); assertEquals("#foo", builder.toString()); } @Test public void addSingleQueryParameter() { - URIBuilder builder = new URIBuilder() + final URIBuilder builder = new URIBuilder() .setScheme("http") .setHost("apache.org") .setPath("/shindig") @@ -189,7 +189,7 @@ public class URIBuilderTests { @Test public void addTwoQueryParameters() { - URIBuilder builder = new URIBuilder() + final URIBuilder builder = new URIBuilder() .setScheme("http") .setHost("apache.org") .setPath("/shindig") @@ -201,10 +201,10 @@ public class URIBuilderTests { @Test public void iterableQueryParameters() { - List list = new ArrayList(); + final List list = new ArrayList(); list.add(new URIBuilder.BasicNameValuePair("hello", "world")); list.add(new URIBuilder.BasicNameValuePair("hello", "monde")); - URIBuilder builder = new URIBuilder() + final URIBuilder builder = new URIBuilder() .setScheme("http") .setHost("apache.org") .setPath("/shindig") @@ -215,14 +215,14 @@ public class URIBuilderTests { @Test public void removeQueryParameter() { - URIBuilder uri = new URIBuilder("http://www.example.com/foo?bar=baz&quux=baz"); + final URIBuilder uri = new URIBuilder("http://www.example.com/foo?bar=baz&quux=baz"); uri.removeQuery(); assertEquals("http://www.example.com/foo", uri.toString()); } @Test public void addIdenticalParameters() { - URIBuilder builder = new URIBuilder() + final URIBuilder builder = new URIBuilder() .setScheme("http") .setHost("apache.org") .setPath("/shindig") @@ -234,7 +234,7 @@ public class URIBuilderTests { @Test public void queryStringIsUnescaped() { - URIBuilder builder = new URIBuilder() + final URIBuilder builder = new URIBuilder() .setScheme("http") .setHost("apache.org") .setPath("/shindig") @@ -244,7 +244,7 @@ public class URIBuilderTests { @Test public void queryParamsAreEscaped() { - URIBuilder builder = new URIBuilder(true) + final URIBuilder builder = new URIBuilder(true) .setScheme("http") .setHost("apache.org") .setEncodedPath("/shindig") @@ -256,7 +256,7 @@ public class URIBuilderTests { @Test public void addSingleFragmentParameter() { - URIBuilder builder = new URIBuilder() + final URIBuilder builder = new URIBuilder() .setScheme("http") .setHost("apache.org") .setPath("/shindig") @@ -267,7 +267,7 @@ public class URIBuilderTests { @Test public void fragmentStringIsUnescaped() { - URIBuilder builder = new URIBuilder(true) + final URIBuilder builder = new URIBuilder(true) .setScheme("http") .setHost("apache.org") .setPath("/shindig") @@ -278,15 +278,15 @@ public class URIBuilderTests { @Test public void parse() { - URIBuilder builder = new URIBuilder() + final URIBuilder builder = new URIBuilder() .digestURI(URI.create("http://apache.org/shindig?foo=bar%26baz&foo=three%3Dbaz#blah")); assertEquals("http", builder.getScheme()); assertEquals("apache.org", builder.getHost()); assertEquals("/shindig", builder.getPath()); - List list = builder.getQueryParams(); - for (URIBuilder.BasicNameValuePair pair : list) { + final List list = builder.getQueryParams(); + for (final URIBuilder.BasicNameValuePair pair : list) { assertEquals("foo", pair.getName()); assertTrue(pair.getValue().equals("three=baz") || pair.getValue().equals("bar&baz")); } @@ -296,16 +296,16 @@ public class URIBuilderTests { @Test public void constructFromUriAndBack() { - URI uri = URI.create("http://apache.org/foo/bar?foo=bar&a=b&c=d&y=z&foo=zoo#foo"); - URIBuilder builder = new URIBuilder(uri); + final URI uri = URI.create("http://apache.org/foo/bar?foo=bar&a=b&c=d&y=z&foo=zoo#foo"); + final URIBuilder builder = new URIBuilder(uri); assertEquals(uri, builder.build()); } @Test public void constructFromUriAndModify() { - URI uri = URI.create("http://apache.org/foo/bar?foo=bar#foo"); - URIBuilder builder = new URIBuilder(uri); + final URI uri = URI.create("http://apache.org/foo/bar?foo=bar#foo"); + final URIBuilder builder = new URIBuilder(uri); builder.setHost("example.org"); builder.addParameter("bar", "foo"); @@ -315,8 +315,8 @@ public class URIBuilderTests { @Test public void equalsAndHashCodeOk() { - URIBuilder uri = new URIBuilder().digestURI(URI.create("http://example.org/foo/bar/baz?blah=blah#boo")); - URIBuilder uri2 = new URIBuilder(URI.create("http://example.org/foo/bar/baz?blah=blah#boo")); + final URIBuilder uri = new URIBuilder().digestURI(URI.create("http://example.org/foo/bar/baz?blah=blah#boo")); + final URIBuilder uri2 = new URIBuilder(URI.create("http://example.org/foo/bar/baz?blah=blah#boo")); assertEquals(uri, uri2); assertEquals(uri2, uri); diff --git a/cas-client-core/src/test/java/org/jasig/cas/client/validation/Cas20ProxyReceivingTicketValidationFilterTests.java b/cas-client-core/src/test/java/org/jasig/cas/client/validation/Cas20ProxyReceivingTicketValidationFilterTests.java index 5aece5d..5636454 100644 --- a/cas-client-core/src/test/java/org/jasig/cas/client/validation/Cas20ProxyReceivingTicketValidationFilterTests.java +++ b/cas-client-core/src/test/java/org/jasig/cas/client/validation/Cas20ProxyReceivingTicketValidationFilterTests.java @@ -48,7 +48,7 @@ public class Cas20ProxyReceivingTicketValidationFilterTests extends TestCase { final Timer timer = new Timer(true) { @Override - public void schedule(TimerTask task, long delay, long period) { + public void schedule(final TimerTask task, final long delay, final long period) { scheduleMethodFlag.setCalled(); } }; @@ -140,19 +140,19 @@ public class Cas20ProxyReceivingTicketValidationFilterTests extends TestCase { } public void testThrowsForNullStorage() throws Exception { - Cas20ProxyReceivingTicketValidationFilter filter = newCas20ProxyReceivingTicketValidationFilter(); + final Cas20ProxyReceivingTicketValidationFilter filter = newCas20ProxyReceivingTicketValidationFilter(); filter.setProxyGrantingTicketStorage(null); try { filter.init(); fail("expected an exception due to null ProxyGrantingTicketStorage"); - } catch (IllegalArgumentException exception) { + } catch (final IllegalArgumentException exception) { // test passes } } public void testGetTicketValidator() throws Exception { - Cas20ProxyReceivingTicketValidationFilter filter = newCas20ProxyReceivingTicketValidationFilter(); + final Cas20ProxyReceivingTicketValidationFilter filter = newCas20ProxyReceivingTicketValidationFilter(); // Test case #1 final MockFilterConfig config1 = new MockFilterConfig(); @@ -165,7 +165,7 @@ public class Cas20ProxyReceivingTicketValidationFilterTests extends TestCase { @Test public void getTicketValidatorWithProxyChains() throws Exception { - Cas20ProxyReceivingTicketValidationFilter filter = newCas20ProxyReceivingTicketValidationFilter(); + final Cas20ProxyReceivingTicketValidationFilter filter = newCas20ProxyReceivingTicketValidationFilter(); // Test case #2 final MockFilterConfig config2 = new MockFilterConfig(); config2.addInitParameter("allowedProxyChains", "https://a.example.com https://b.example.com"); @@ -178,7 +178,7 @@ public class Cas20ProxyReceivingTicketValidationFilterTests extends TestCase { @Test public void getTIcketValidatorWithProxyChainsAndLineBreak() throws Exception { - Cas20ProxyReceivingTicketValidationFilter filter = newCas20ProxyReceivingTicketValidationFilter(); + final Cas20ProxyReceivingTicketValidationFilter filter = newCas20ProxyReceivingTicketValidationFilter(); // Test case #3 final MockFilterConfig config3 = new MockFilterConfig(); 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 e044f15..e5a9ca7 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 @@ -76,7 +76,7 @@ public final class Cas20ProxyTicketValidatorTests extends AbstractTicketValidato private static final long serialVersionUID = 1L; @Override - public String getProxyTicketIdFor(String proxyGrantingTicketId, String targetService) { + public String getProxyTicketIdFor(final String proxyGrantingTicketId, final String targetService) { return "test"; } }; @@ -100,7 +100,7 @@ public final class Cas20ProxyTicketValidatorTests extends AbstractTicketValidato try { this.ticketValidator.validate("test", "test"); fail("Invalid proxy chain"); - } catch (InvalidProxyChainTicketValidationException e) { + } catch (final InvalidProxyChainTicketValidationException e) { // expected } } @@ -131,7 +131,7 @@ public final class Cas20ProxyTicketValidatorTests extends AbstractTicketValidato try { this.ticketValidator.validate("test", "test"); fail("Invalid proxy chain"); - } catch (InvalidProxyChainTicketValidationException e) { + } catch (final InvalidProxyChainTicketValidationException e) { // expected } } diff --git a/cas-client-core/src/test/java/org/jasig/cas/client/validation/Cas20ServiceTicketValidatorTests.java b/cas-client-core/src/test/java/org/jasig/cas/client/validation/Cas20ServiceTicketValidatorTests.java index f36f939..040177b 100644 --- a/cas-client-core/src/test/java/org/jasig/cas/client/validation/Cas20ServiceTicketValidatorTests.java +++ b/cas-client-core/src/test/java/org/jasig/cas/client/validation/Cas20ServiceTicketValidatorTests.java @@ -75,7 +75,7 @@ public final class Cas20ServiceTicketValidatorTests extends AbstractTicketValida private static final long serialVersionUID = 1L; @Override - public String getProxyTicketIdFor(String proxyGrantingTicketId, String targetService) { + public String getProxyTicketIdFor(final String proxyGrantingTicketId, final String targetService) { return "test"; } }; @@ -136,9 +136,9 @@ public final class Cas20ServiceTicketValidatorTests extends AbstractTicketValida assertEquals("id", principal.getAttributes().get("eduPersonId")); assertEquals("test1\n\ntest", principal.getAttributes().get("longAttribute")); try { - List multivalued = (List) principal.getAttributes().get("multivaluedAttribute"); + final List multivalued = (List) principal.getAttributes().get("multivaluedAttribute"); assertArrayEquals(new String[] { "value1", "value2" }, multivalued.toArray()); - } catch (Exception e) { + } catch (final Exception e) { fail("'multivaluedAttribute' attribute expected as List object."); } assertEquals(PGT, proxyGrantingTicketField.get(principal)); diff --git a/cas-client-core/src/test/java/org/jasig/cas/client/validation/Cas30ServiceTicketValidatorTests.java b/cas-client-core/src/test/java/org/jasig/cas/client/validation/Cas30ServiceTicketValidatorTests.java index 11c4507..a22c048 100644 --- a/cas-client-core/src/test/java/org/jasig/cas/client/validation/Cas30ServiceTicketValidatorTests.java +++ b/cas-client-core/src/test/java/org/jasig/cas/client/validation/Cas30ServiceTicketValidatorTests.java @@ -69,7 +69,7 @@ public final class Cas30ServiceTicketValidatorTests extends AbstractTicketValida private static final long serialVersionUID = 1L; @Override - public String getProxyTicketIdFor(String proxyGrantingTicketId, String targetService) { + public String getProxyTicketIdFor(final String proxyGrantingTicketId, final String targetService) { return "test"; } }; @@ -135,9 +135,9 @@ public final class Cas30ServiceTicketValidatorTests extends AbstractTicketValida assertEquals("id", assertion.getPrincipal().getAttributes().get("eduPersonId")); assertEquals("test1\n\ntest", assertion.getPrincipal().getAttributes().get("longAttribute")); try { - List multivalued = (List) assertion.getPrincipal().getAttributes().get("multivaluedAttribute"); + final List multivalued = (List) assertion.getPrincipal().getAttributes().get("multivaluedAttribute"); assertArrayEquals(new String[] { "value1", "value2" }, multivalued.toArray()); - } catch (Exception e) { + } catch (final Exception e) { fail("'multivaluedAttribute' attribute expected as List object."); } //assertEquals(PGT, assertion.getProxyGrantingTicketId()); @@ -160,9 +160,9 @@ public final class Cas30ServiceTicketValidatorTests extends AbstractTicketValida assertEquals("id", assertion.getPrincipal().getAttributes().get("eduPersonId")); assertEquals("test1\n\ntest", assertion.getPrincipal().getAttributes().get("longAttribute")); try { - List multivalued = (List) assertion.getPrincipal().getAttributes().get("multivaluedAttribute"); + final List multivalued = (List) assertion.getPrincipal().getAttributes().get("multivaluedAttribute"); assertArrayEquals(new String[] { "value1", "value2" }, multivalued.toArray()); - } catch (Exception e) { + } catch (final Exception e) { fail("'multivaluedAttribute' attribute expected as List object."); } //assertEquals(PGT, assertion.getProxyGrantingTicketId()); diff --git a/cas-client-integration-jetty/src/main/java/org/jasig/cas/client/jetty/CasAuthenticator.java b/cas-client-integration-jetty/src/main/java/org/jasig/cas/client/jetty/CasAuthenticator.java index 43e68cf..33a42b1 100644 --- a/cas-client-integration-jetty/src/main/java/org/jasig/cas/client/jetty/CasAuthenticator.java +++ b/cas-client-integration-jetty/src/main/java/org/jasig/cas/client/jetty/CasAuthenticator.java @@ -167,7 +167,7 @@ public class CasAuthenticator extends AbstractLifeCycle implements Authenticator logger.info("Successfully authenticated {}", assertion.getPrincipal()); authentication = new CasAuthentication(this, ticket, assertion); cacheAuthentication(request, authentication); - } catch (Exception e) { + } catch (final Exception e) { throw new ServerAuthException("CAS ticket validation failed", e); } } @@ -240,7 +240,7 @@ public class CasAuthenticator extends AbstractLifeCycle implements Authenticator casServerLoginUrl, protocol.getServiceParameterName(), serviceUrl(request, response), renew, false, null); logger.debug("Redirecting to {}", redirectUrl); response.sendRedirect(redirectUrl); - } catch (IOException e) { + } catch (final IOException e) { logger.debug("Redirect to CAS failed with error", e); throw new ServerAuthException("Redirect to CAS failed", e); } diff --git a/cas-client-integration-jetty/src/test/java/org/jasig/cas/client/jetty/CasAuthenticatorTest.java b/cas-client-integration-jetty/src/test/java/org/jasig/cas/client/jetty/CasAuthenticatorTest.java index 462f353..b8a9d24 100644 --- a/cas-client-integration-jetty/src/test/java/org/jasig/cas/client/jetty/CasAuthenticatorTest.java +++ b/cas-client-integration-jetty/src/test/java/org/jasig/cas/client/jetty/CasAuthenticatorTest.java @@ -200,11 +200,11 @@ public class CasAuthenticatorTest { final HttpURLConnection uc; try { uc = (HttpURLConnection) new URL(url).openConnection(); - } catch (IOException e) { + } catch (final IOException e) { throw new RuntimeException("Invalid URL: " + url, e); } uc.setInstanceFollowRedirects(false); uc.connect(); return uc; } -} \ No newline at end of file +} diff --git a/cas-client-integration-tomcat-common/src/main/java/org/jasig/cas/client/tomcat/AuthenticatorDelegate.java b/cas-client-integration-tomcat-common/src/main/java/org/jasig/cas/client/tomcat/AuthenticatorDelegate.java index a47c74d..7d61057 100644 --- a/cas-client-integration-tomcat-common/src/main/java/org/jasig/cas/client/tomcat/AuthenticatorDelegate.java +++ b/cas-client-integration-tomcat-common/src/main/java/org/jasig/cas/client/tomcat/AuthenticatorDelegate.java @@ -107,7 +107,7 @@ public final class AuthenticatorDelegate { return null; } } - Principal p = realm.authenticate(assertion.getPrincipal()); + final Principal p = realm.authenticate(assertion.getPrincipal()); if (p == null) { logger.debug("{} failed to authenticate to {}", assertion.getPrincipal().getName(), realm); setUnauthorized(response, null); @@ -192,7 +192,7 @@ public final class AuthenticatorDelegate { } else { response.sendError(HttpServletResponse.SC_UNAUTHORIZED); } - } catch (IOException e) { + } catch (final IOException e) { throw new IllegalStateException("Error setting 403 status.", e); } } diff --git a/cas-client-integration-tomcat-v6/src/main/java/org/jasig/cas/client/tomcat/v6/SingleSignOutValve.java b/cas-client-integration-tomcat-v6/src/main/java/org/jasig/cas/client/tomcat/v6/SingleSignOutValve.java index a2510eb..674eb0b 100644 --- a/cas-client-integration-tomcat-v6/src/main/java/org/jasig/cas/client/tomcat/v6/SingleSignOutValve.java +++ b/cas-client-integration-tomcat-v6/src/main/java/org/jasig/cas/client/tomcat/v6/SingleSignOutValve.java @@ -56,7 +56,7 @@ public class SingleSignOutValve extends AbstractLifecycleValve implements Sessio this.handler.setRelayStateParameterName(name); } - public void setLogoutCallbackPath(String logoutCallbackPath) { + public void setLogoutCallbackPath(final String logoutCallbackPath) { this.handler.setLogoutCallbackPath(logoutCallbackPath); } diff --git a/cas-client-integration-tomcat-v7/src/main/java/org/jasig/cas/client/tomcat/v7/AbstractAuthenticator.java b/cas-client-integration-tomcat-v7/src/main/java/org/jasig/cas/client/tomcat/v7/AbstractAuthenticator.java index 21484af..cf48d73 100644 --- a/cas-client-integration-tomcat-v7/src/main/java/org/jasig/cas/client/tomcat/v7/AbstractAuthenticator.java +++ b/cas-client-integration-tomcat-v7/src/main/java/org/jasig/cas/client/tomcat/v7/AbstractAuthenticator.java @@ -189,7 +189,7 @@ public abstract class AbstractAuthenticator extends AuthenticatorBase implements /** {@inheritDoc} */ @Override - protected synchronized void setState(LifecycleState state, Object data) throws LifecycleException { + protected synchronized void setState(final LifecycleState state, final Object data) throws LifecycleException { super.setState(state, data); if (LifecycleState.STARTED.equals(state)) { logger.info("{} started.", getName()); diff --git a/cas-client-integration-tomcat-v7/src/main/java/org/jasig/cas/client/tomcat/v7/SingleSignOutValve.java b/cas-client-integration-tomcat-v7/src/main/java/org/jasig/cas/client/tomcat/v7/SingleSignOutValve.java index e62d9ac..669b5d5 100644 --- a/cas-client-integration-tomcat-v7/src/main/java/org/jasig/cas/client/tomcat/v7/SingleSignOutValve.java +++ b/cas-client-integration-tomcat-v7/src/main/java/org/jasig/cas/client/tomcat/v7/SingleSignOutValve.java @@ -60,7 +60,7 @@ public class SingleSignOutValve extends ValveBase implements SessionListener { this.handler.setRelayStateParameterName(name); } - public void setLogoutCallbackPath(String logoutCallbackPath) { + public void setLogoutCallbackPath(final String logoutCallbackPath) { this.handler.setLogoutCallbackPath(logoutCallbackPath); } diff --git a/cas-client-integration-tomcat-v8/src/main/java/org/jasig/cas/client/tomcat/v8/SingleSignOutValve.java b/cas-client-integration-tomcat-v8/src/main/java/org/jasig/cas/client/tomcat/v8/SingleSignOutValve.java index c66faee..60f1a8a 100644 --- a/cas-client-integration-tomcat-v8/src/main/java/org/jasig/cas/client/tomcat/v8/SingleSignOutValve.java +++ b/cas-client-integration-tomcat-v8/src/main/java/org/jasig/cas/client/tomcat/v8/SingleSignOutValve.java @@ -60,7 +60,7 @@ public class SingleSignOutValve extends ValveBase implements SessionListener { this.handler.setRelayStateParameterName(name); } - public void setLogoutCallbackPath(String logoutCallbackPath) { + public void setLogoutCallbackPath(final String logoutCallbackPath) { this.handler.setLogoutCallbackPath(logoutCallbackPath); } diff --git a/cas-client-integration-tomcat-v85/src/main/java/org/jasig/cas/client/tomcat/v85/SingleSignOutValve.java b/cas-client-integration-tomcat-v85/src/main/java/org/jasig/cas/client/tomcat/v85/SingleSignOutValve.java index 02e3e30..9b69e7a 100644 --- a/cas-client-integration-tomcat-v85/src/main/java/org/jasig/cas/client/tomcat/v85/SingleSignOutValve.java +++ b/cas-client-integration-tomcat-v85/src/main/java/org/jasig/cas/client/tomcat/v85/SingleSignOutValve.java @@ -60,7 +60,7 @@ public class SingleSignOutValve extends ValveBase implements SessionListener { this.handler.setRelayStateParameterName(name); } - public void setLogoutCallbackPath(String logoutCallbackPath) { + public void setLogoutCallbackPath(final String logoutCallbackPath) { this.handler.setLogoutCallbackPath(logoutCallbackPath); } diff --git a/cas-client-support-distributed-memcached/pom.xml b/cas-client-support-distributed-memcached/pom.xml index 302eab4..462da96 100644 --- a/cas-client-support-distributed-memcached/pom.xml +++ b/cas-client-support-distributed-memcached/pom.xml @@ -9,9 +9,7 @@ jar cas-client-support-distributed-memcached - Jasig CAS Client for Java - Distributed Proxy Storage Support: - Memcached - + Jasig CAS Client for Java - Distributed Proxy Storage Support: Memcached diff --git a/cas-client-support-saml/src/main/java/org/jasig/cas/client/validation/Saml11TicketValidator.java b/cas-client-support-saml/src/main/java/org/jasig/cas/client/validation/Saml11TicketValidator.java index 2f8a7e5..ea7db4f 100644 --- a/cas-client-support-saml/src/main/java/org/jasig/cas/client/validation/Saml11TicketValidator.java +++ b/cas-client-support-saml/src/main/java/org/jasig/cas/client/validation/Saml11TicketValidator.java @@ -90,7 +90,7 @@ public final class Saml11TicketValidator extends AbstractUrlBasedTicketValidator try { SAML_REQUEST_TEMPLATE = IOUtils.readString( Saml11TicketValidator.class.getResourceAsStream("/META-INF/cas/samlRequestTemplate.xml")); - } catch (IOException e) { + } catch (final IOException e) { throw new IllegalStateException("Cannot load SAML request template from classpath", e); } @@ -101,7 +101,7 @@ public final class Saml11TicketValidator extends AbstractUrlBasedTicketValidator try { random = SecureRandom.getInstance("SHA1PRNG"); - } catch (NoSuchAlgorithmException e) { + } catch (final NoSuchAlgorithmException e) { throw new IllegalStateException("Cannot find required SHA1PRNG algorithm"); } } diff --git a/cas-client-support-springboot/NOTICE b/cas-client-support-springboot/NOTICE new file mode 100644 index 0000000..bab9bec --- /dev/null +++ b/cas-client-support-springboot/NOTICE @@ -0,0 +1,30 @@ +Licensed to Apereo under one or more contributor license +agreements. See the NOTICE file distributed with this work +for additional information regarding copyright ownership. +Apereo licenses this file to you under the Apache License, +Version 2.0 (the "License"); you may not use this file +except in compliance with the License. You may obtain a +copy of the License at the following location: + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, +software distributed under the License is distributed on an +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, either express or implied. See the License for the +specific language governing permissions and limitations +under the License. + +This project includes: + Jasig CAS Client for Java - Core under Apache License Version 2.0 + Jasig CAS Client for Java - SAML Protocol Support under Apache License Version 2.0 + Java Servlet API under CDDL + GPLv2 with classpath exception + JCL 1.1.1 implemented over SLF4J under MIT License + Joda-Time under Apache 2 + JUnit under Common Public License Version 1.0 + SLF4J API Module under MIT License + SLF4J Simple Binding under MIT License + spring-asm under The Apache Software License, Version 2.0 + spring-core under The Apache Software License, Version 2.0 + spring-test under The Apache Software License, Version 2.0 + diff --git a/cas-client-support-springboot/pom.xml b/cas-client-support-springboot/pom.xml new file mode 100644 index 0000000..968b080 --- /dev/null +++ b/cas-client-support-springboot/pom.xml @@ -0,0 +1,59 @@ + + + org.jasig.cas.client + 3.6.0-SNAPSHOT + cas-client + + 4.0.0 + cas-client-support-springboot + jar + Jasig CAS Client for Java - Spring Boot Support + Library providing annotation-based configuration support for CAS Java clients. + Primarily designed for super easy CASification of Spring Boot apps. + + + + org.jasig.cas.client + cas-client-core + ${project.version} + + + org.jasig.cas.client + cas-client-support-saml + ${project.version} + + + org.springframework.boot + spring-boot-starter + ${springboot.version} + provided + + + org.springframework + spring-core + provided + + + org.springframework + spring-context + provided + + + + org.jasig.cas.client + cas-client-core + ${project.version} + test-jar + test + + + org.springframework + spring-test + test + + + + + 2.1.7.RELEASE + + diff --git a/cas-client-support-springboot/src/main/java/org/jasig/cas/client/boot/configuration/CasClientConfiguration.java b/cas-client-support-springboot/src/main/java/org/jasig/cas/client/boot/configuration/CasClientConfiguration.java new file mode 100644 index 0000000..41f3ce5 --- /dev/null +++ b/cas-client-support-springboot/src/main/java/org/jasig/cas/client/boot/configuration/CasClientConfiguration.java @@ -0,0 +1,184 @@ +package org.jasig.cas.client.boot.configuration; + +import org.jasig.cas.client.authentication.AuthenticationFilter; +import org.jasig.cas.client.authentication.Saml11AuthenticationFilter; +import org.jasig.cas.client.util.AssertionThreadLocalFilter; +import org.jasig.cas.client.util.HttpServletRequestWrapperFilter; +import org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter; +import org.jasig.cas.client.validation.Cas30ProxyReceivingTicketValidationFilter; +import org.jasig.cas.client.validation.Saml11TicketValidationFilter; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.util.CollectionUtils; +import org.springframework.util.StringUtils; + +import javax.servlet.Filter; + +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Configuration class providing default CAS client infrastructure filters. + * This configuration facility is typically imported into Spring's Application Context via + * {@link EnableCasClient} meta annotation. + * + * @author Dmitriy Kopylenko + * @since 3.6.0 + */ +@Configuration +@EnableConfigurationProperties(CasClientConfigurationProperties.class) +public class CasClientConfiguration { + + @Autowired + CasClientConfigurationProperties configProps; + + private CasClientConfigurer casClientConfigurer; + + private static Map constructInitParams(final String casUrlParamName, final String casUrlParamVal, final String clientHostUrlVal) { + final Map initParams = new HashMap<>(2); + initParams.put(casUrlParamName, casUrlParamVal); + initParams.put("serverName", clientHostUrlVal); + return initParams; + } + + private static void initFilter(final FilterRegistrationBean filterRegistrationBean, + final Filter targetFilter, + final int filterOrder, + final Map initParams, + final List urlPatterns) { + + filterRegistrationBean.setFilter(targetFilter); + filterRegistrationBean.setOrder(filterOrder); + filterRegistrationBean.setInitParameters(initParams); + if (!urlPatterns.isEmpty()) { + filterRegistrationBean.setUrlPatterns(urlPatterns); + } + } + + @Bean + @ConditionalOnProperty(prefix = "cas", name = "skipTicketValidation", havingValue = "false", matchIfMissing = true) + public FilterRegistrationBean casValidationFilter() { + final FilterRegistrationBean validationFilter = new FilterRegistrationBean(); + final Filter targetCasValidationFilter; + switch (this.configProps.getValidationType()) { + case CAS: + targetCasValidationFilter = new Cas20ProxyReceivingTicketValidationFilter(); + break; + case SAML: + targetCasValidationFilter = new Saml11TicketValidationFilter(); + break; + case CAS3: + default: + targetCasValidationFilter = new Cas30ProxyReceivingTicketValidationFilter(); + break; + } + + initFilter(validationFilter, + targetCasValidationFilter, + 1, + constructInitParams("casServerUrlPrefix", this.configProps.getServerUrlPrefix(), this.configProps.getClientHostUrl()), + this.configProps.getValidationUrlPatterns()); + + if (this.configProps.getUseSession() != null) { + validationFilter.getInitParameters().put("useSession", String.valueOf(this.configProps.getUseSession())); + } + if (this.configProps.getRedirectAfterValidation() != null) { + validationFilter.getInitParameters().put("redirectAfterValidation", String.valueOf(this.configProps.getRedirectAfterValidation())); + } + + //Proxy tickets validation + if (this.configProps.getAcceptAnyProxy() != null) { + validationFilter.getInitParameters().put("acceptAnyProxy", String.valueOf(this.configProps.getAcceptAnyProxy())); + } + if (!this.configProps.getAllowedProxyChains().isEmpty()) { + validationFilter.getInitParameters().put("allowedProxyChains", + StringUtils.collectionToDelimitedString(this.configProps.getAllowedProxyChains(), " ")); + } + if (this.configProps.getProxyCallbackUrl() != null) { + validationFilter.getInitParameters().put("proxyCallbackUrl", this.configProps.getProxyCallbackUrl()); + } + if (this.configProps.getProxyReceptorUrl() != null) { + validationFilter.getInitParameters().put("proxyReceptorUrl", this.configProps.getProxyReceptorUrl()); + } + + if (this.casClientConfigurer != null) { + this.casClientConfigurer.configureValidationFilter(validationFilter); + } + return validationFilter; + } + + @Bean + public FilterRegistrationBean casAuthenticationFilter() { + final FilterRegistrationBean authnFilter = new FilterRegistrationBean(); + final Filter targetCasAuthnFilter = + this.configProps.getValidationType() == EnableCasClient.ValidationType.CAS + || configProps.getValidationType() == EnableCasClient.ValidationType.CAS3 + ? new AuthenticationFilter() + : new Saml11AuthenticationFilter(); + + initFilter(authnFilter, + targetCasAuthnFilter, + 2, + constructInitParams("casServerLoginUrl", this.configProps.getServerLoginUrl(), this.configProps.getClientHostUrl()), + this.configProps.getAuthenticationUrlPatterns()); + + if (this.configProps.getGateway() != null) { + authnFilter.getInitParameters().put("gateway", String.valueOf(this.configProps.getGateway())); + } + + if (this.casClientConfigurer != null) { + this.casClientConfigurer.configureAuthenticationFilter(authnFilter); + } + return authnFilter; + } + + @Bean + public FilterRegistrationBean casHttpServletRequestWrapperFilter() { + final FilterRegistrationBean reqWrapperFilter = new FilterRegistrationBean(); + reqWrapperFilter.setFilter(new HttpServletRequestWrapperFilter()); + if (!this.configProps.getRequestWrapperUrlPatterns().isEmpty()) { + reqWrapperFilter.setUrlPatterns(this.configProps.getRequestWrapperUrlPatterns()); + } + reqWrapperFilter.setOrder(3); + + if (this.casClientConfigurer != null) { + this.casClientConfigurer.configureHttpServletRequestWrapperFilter(reqWrapperFilter); + } + return reqWrapperFilter; + } + + @Bean + public FilterRegistrationBean casAssertionThreadLocalFilter() { + final FilterRegistrationBean assertionTLFilter = new FilterRegistrationBean(); + assertionTLFilter.setFilter(new AssertionThreadLocalFilter()); + if (!this.configProps.getAssertionThreadLocalUrlPatterns().isEmpty()) { + assertionTLFilter.setUrlPatterns(this.configProps.getAssertionThreadLocalUrlPatterns()); + } + assertionTLFilter.setOrder(4); + + if (this.casClientConfigurer != null) { + this.casClientConfigurer.configureAssertionThreadLocalFilter(assertionTLFilter); + } + return assertionTLFilter; + } + + @Autowired(required = false) + void setConfigurers(final Collection configurers) { + if (CollectionUtils.isEmpty(configurers)) { + return; + } + if (configurers.size() > 1) { + throw new IllegalStateException(configurers.size() + " implementations of " + + "CasClientConfigurer were found when only 1 was expected. " + + "Refactor the configuration such that CasClientConfigurer is " + + "implemented only once or not at all."); + } + this.casClientConfigurer = configurers.iterator().next(); + } +} diff --git a/cas-client-support-springboot/src/main/java/org/jasig/cas/client/boot/configuration/CasClientConfigurationProperties.java b/cas-client-support-springboot/src/main/java/org/jasig/cas/client/boot/configuration/CasClientConfigurationProperties.java new file mode 100644 index 0000000..ca2bc06 --- /dev/null +++ b/cas-client-support-springboot/src/main/java/org/jasig/cas/client/boot/configuration/CasClientConfigurationProperties.java @@ -0,0 +1,227 @@ +package org.jasig.cas.client.boot.configuration; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.lang.NonNull; + +import java.util.ArrayList; +import java.util.List; + +/** + * {@link ConfigurationProperties} for CAS Java client filters. + *

+ * Will be used to customize CAS filters via simple properties or YAML files in standard Spring Boot PropertySources. + * + * @author Dmitriy Kopylenko + * @since 3.6.0 + */ +@ConfigurationProperties(prefix = "cas", ignoreUnknownFields = false) +public class CasClientConfigurationProperties { + + /** + * CAS server URL E.g. https://example.com/cas or https://cas.example. Required. + */ + @NonNull + private String serverUrlPrefix; + + /** + * CAS server login URL E.g. https://example.com/cas/login or https://cas.example/login. Required. + */ + @NonNull + private String serverLoginUrl; + + /** + * CAS-protected client application host URL E.g. https://myclient.example.com Required. + */ + @NonNull + private String clientHostUrl; + + /** + * List of URL patterns protected by CAS authentication filter. + */ + private List authenticationUrlPatterns = new ArrayList<>(); + + /** + * List of URL patterns protected by CAS validation filter. + */ + private List validationUrlPatterns = new ArrayList<>(); + + /** + * List of URL patterns protected by CAS request wrapper filter. + */ + private List requestWrapperUrlPatterns = new ArrayList<>(); + + /** + * List of URL patterns protected by CAS assertion thread local filter. + */ + private List assertionThreadLocalUrlPatterns = new ArrayList<>(); + + /** + * Authentication filter gateway parameter. + */ + private Boolean gateway; + + /** + * Validation filter useSession parameter. + */ + private Boolean useSession; + + /** + * Validation filter redirectAfterValidation. + */ + private Boolean redirectAfterValidation; + + /** + * Cas20ProxyReceivingTicketValidationFilter acceptAnyProxy parameter. + */ + private Boolean acceptAnyProxy; + + /** + * Cas20ProxyReceivingTicketValidationFilter allowedProxyChains parameter. + */ + private List allowedProxyChains = new ArrayList<>(); + + /** + * Cas20ProxyReceivingTicketValidationFilter proxyCallbackUrl parameter. + */ + private String proxyCallbackUrl; + + /** + * Cas20ProxyReceivingTicketValidationFilter proxyReceptorUrl parameter. + */ + private String proxyReceptorUrl; + + /** + * ValidationType the CAS protocol validation type. Defaults to CAS3 if not explicitly set. + */ + private EnableCasClient.ValidationType validationType = EnableCasClient.ValidationType.CAS3; + + private Boolean skipTicketValidation = false; + + public String getServerUrlPrefix() { + return serverUrlPrefix; + } + + public void setServerUrlPrefix(final String serverUrlPrefix) { + this.serverUrlPrefix = serverUrlPrefix; + } + + public String getServerLoginUrl() { + return serverLoginUrl; + } + + public void setServerLoginUrl(final String serverLoginUrl) { + this.serverLoginUrl = serverLoginUrl; + } + + public String getClientHostUrl() { + return clientHostUrl; + } + + public void setClientHostUrl(final String clientHostUrl) { + this.clientHostUrl = clientHostUrl; + } + + public Boolean getAcceptAnyProxy() { + return acceptAnyProxy; + } + + public void setAcceptAnyProxy(final Boolean acceptAnyProxy) { + this.acceptAnyProxy = acceptAnyProxy; + } + + public List getAllowedProxyChains() { + return allowedProxyChains; + } + + public void setAllowedProxyChains(final List allowedProxyChains) { + this.allowedProxyChains = allowedProxyChains; + } + + public String getProxyCallbackUrl() { + return proxyCallbackUrl; + } + + public void setProxyCallbackUrl(final String proxyCallbackUrl) { + this.proxyCallbackUrl = proxyCallbackUrl; + } + + public String getProxyReceptorUrl() { + return proxyReceptorUrl; + } + + public void setProxyReceptorUrl(final String proxyReceptorUrl) { + this.proxyReceptorUrl = proxyReceptorUrl; + } + + public Boolean getGateway() { + return gateway; + } + + public void setGateway(final Boolean gateway) { + this.gateway = gateway; + } + + public Boolean getUseSession() { + return useSession; + } + + public void setUseSession(final Boolean useSession) { + this.useSession = useSession; + } + + public Boolean getRedirectAfterValidation() { + return redirectAfterValidation; + } + + public void setRedirectAfterValidation(final Boolean redirectAfterValidation) { + this.redirectAfterValidation = redirectAfterValidation; + } + + public List getAssertionThreadLocalUrlPatterns() { + return assertionThreadLocalUrlPatterns; + } + + public void setAssertionThreadLocalUrlPatterns(final List assertionThreadLocalUrlPatterns) { + this.assertionThreadLocalUrlPatterns = assertionThreadLocalUrlPatterns; + } + + public List getRequestWrapperUrlPatterns() { + return requestWrapperUrlPatterns; + } + + public void setRequestWrapperUrlPatterns(final List requestWrapperUrlPatterns) { + this.requestWrapperUrlPatterns = requestWrapperUrlPatterns; + } + + public List getValidationUrlPatterns() { + return validationUrlPatterns; + } + + public void setValidationUrlPatterns(final List validationUrlPatterns) { + this.validationUrlPatterns = validationUrlPatterns; + } + + public List getAuthenticationUrlPatterns() { + return authenticationUrlPatterns; + } + + public void setAuthenticationUrlPatterns(final List authenticationUrlPatterns) { + this.authenticationUrlPatterns = authenticationUrlPatterns; + } + + public EnableCasClient.ValidationType getValidationType() { + return validationType; + } + + public void setValidationType(final EnableCasClient.ValidationType validationType) { + this.validationType = validationType; + } + + public Boolean getSkipTicketValidation() { + return skipTicketValidation; + } + + public void setSkipTicketValidation(final Boolean skipTicketValidation) { + this.skipTicketValidation = skipTicketValidation; + } +} diff --git a/cas-client-support-springboot/src/main/java/org/jasig/cas/client/boot/configuration/CasClientConfigurer.java b/cas-client-support-springboot/src/main/java/org/jasig/cas/client/boot/configuration/CasClientConfigurer.java new file mode 100644 index 0000000..534a418 --- /dev/null +++ b/cas-client-support-springboot/src/main/java/org/jasig/cas/client/boot/configuration/CasClientConfigurer.java @@ -0,0 +1,46 @@ +package org.jasig.cas.client.boot.configuration; + +import org.springframework.boot.web.servlet.FilterRegistrationBean; + +/** + * Callback interface to be implemented by {@link org.springframework.context.annotation.Configuration Configuration} classes annotated with + * {@link EnableCasClient} that wish or need to + * explicitly configure or customize CAS client filters created by {@link CasClientConfiguration}. + * + * @author Dmitriy Kopylenko + * @since 3.6.0 + */ +public interface CasClientConfigurer { + + /** + * Configure or customize CAS authentication filter. + * + * @param authenticationFilter the authentication filter + */ + default void configureAuthenticationFilter(final FilterRegistrationBean authenticationFilter) { + } + + /** + * Configure or customize CAS validation filter. + * + * @param validationFilter the validation filter + */ + default void configureValidationFilter(final FilterRegistrationBean validationFilter) { + } + + /** + * Configure or customize CAS http servlet wrapper filter. + * + * @param httpServletRequestWrapperFilter the http servlet request wrapper filter + */ + default void configureHttpServletRequestWrapperFilter(final FilterRegistrationBean httpServletRequestWrapperFilter) { + } + + /** + * Configure or customize CAS assertion thread local filter. + * + * @param assertionThreadLocalFilter the assertion thread local filter + */ + default void configureAssertionThreadLocalFilter(final FilterRegistrationBean assertionThreadLocalFilter) { + } +} diff --git a/cas-client-support-springboot/src/main/java/org/jasig/cas/client/boot/configuration/EnableCasClient.java b/cas-client-support-springboot/src/main/java/org/jasig/cas/client/boot/configuration/EnableCasClient.java new file mode 100644 index 0000000..5f95d7e --- /dev/null +++ b/cas-client-support-springboot/src/main/java/org/jasig/cas/client/boot/configuration/EnableCasClient.java @@ -0,0 +1,35 @@ +package org.jasig.cas.client.boot.configuration; + +import org.springframework.context.annotation.Import; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Enables CAS Java client Servlet Filters configuration facility. + * To be used together with {@link org.springframework.context.annotation.Configuration Configuration} + * or {@link org.springframework.boot.autoconfigure.SpringBootApplication SpringBootApplication} classes. + * + *

For those wishing to customize CAS filters during their creation, application configuration classes carrying this annotation + * may implement the {@link CasClientConfigurer} callback interface and override only necessary methods. + * + * @author Dmitriy Kopylenko + * @since 3.6.0 + */ +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Inherited +@Import(CasClientConfiguration.class) +public @interface EnableCasClient { + + enum ValidationType { + CAS, + CAS3, + SAML + } +} diff --git a/pom.xml b/pom.xml index 093a8a4..baea5c3 100644 --- a/pom.xml +++ b/pom.xml @@ -10,24 +10,19 @@ cas-client pom - Jasig CAS Client for Java + Apereo CAS Client for Java - Jasig CAS Client for Java is the integration point for applications that want to speak with a CAS + Apereo CAS Client for Java is the integration point for applications that want to speak with a CAS server, either via the CAS 1.0 or CAS 2.0 protocol. - http://www.jasig.org/cas - - - JIRA - https://issues.jasig.org/browse/CASC - + https://www.apereo.org/cas - scm:git:git@github.com:Jasig/java-cas-client.git - scm:git:git@github.com:Jasig/java-cas-client.git - https://github.com/Jasig/java-cas-client - HEAD - + scm:git:git@github.com:apereo/java-cas-client.git + scm:git:git@github.com:apereo/java-cas-client.git + https://github.com/apereo/java-cas-client + HEAD + 2006 @@ -55,8 +50,8 @@ - Jasig - http://www.jasig.org + Apereo + https://www.apereo.org @@ -76,8 +71,8 @@ maven-compiler-plugin 3.8.1 - 1.6 - 1.6 + 1.8 + 1.8 @@ -190,6 +185,12 @@ ${spring.version} + + org.springframework + spring-web + ${spring.version} + + org.springframework spring-test @@ -277,6 +278,7 @@ cas-client-support-distributed-ehcache cas-client-support-distributed-memcached cas-client-support-saml + cas-client-support-springboot cas-client-integration-tomcat-common cas-client-integration-tomcat-v6 cas-client-integration-tomcat-v7 @@ -289,7 +291,7 @@ 5.1.9.RELEASE 2.6.11 3.0.2 - 1.7.26 - 2.9.9.2 + 1.7.27 + 2.9.9.3