package net.unicon.cas.addons.ticket.expiration; import java.util.regex.Pattern; import javax.servlet.http.HttpServletRequest; import org.apache.http.conn.util.InetAddressUtils; import org.jasig.cas.ticket.TicketState; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * An extension of the {@link TicketExpirationPolicyEvaluator} that is able to * determine whether the remote address of the incoming request matches a particular IP pattern. * The pattern may be specified as regular expression that is compiled and run against the remote address. * The retrieval of the remote IP address may be provided via IPv6 or IPv4 syntax. * * <p><strong>NOTE:</strong> If you prefer to configure the pattern by IPv4 syntax only, * add the <code>-Djava.net.preferIPv4Stack=true</code> flag to your <code>JAVA_OPTS</code> * environment variable prior to restarting the container. * @author Misagh Moayyed * @since 1.9 * @see CompositeTicketGrantingTicketExpirationPolicy */ public class IpAddressBasedExpirationPolicyEvaluator implements TicketExpirationPolicyEvaluator { private final Logger logger = LoggerFactory.getLogger(this.getClass()); private Pattern ipAddressPattern; public IpAddressBasedExpirationPolicyEvaluator(final String ipPattern) { this.ipAddressPattern = Pattern.compile(ipPattern); } @Override public boolean doesSatisfyTicketExpirationPolicy(final HttpServletRequest request, final TicketState state) { final String currentIp = request.getRemoteAddr(); if (InetAddressUtils.isIPv6Address(currentIp)) { logger.debug("Remote IP [{}] is a valid standard (non-compressed) IPv6 address", currentIp); } else if (InetAddressUtils.isIPv6HexCompressedAddress(currentIp)) { logger.debug("Remote IP [{}] is a valid IPv6 address (including compressed).", currentIp); } else if (InetAddressUtils.isIPv6StdAddress(currentIp)) { logger.debug("Remote IP [{}] is a valid compressed IPv6 address", currentIp); } else if (InetAddressUtils.isIPv4Address(currentIp)) { logger.debug("Remote IP [{}] is a valid IPv4 address ", currentIp); } else { logger.debug("Remote IP [{}] does not match a known IP syntax", currentIp); } return this.ipAddressPattern.matcher(currentIp).find(); } }