package org.togglz.core.activation; import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; import java.util.Enumeration; import java.util.HashSet; import java.util.List; import java.util.Set; import org.togglz.core.logging.Log; import org.togglz.core.logging.LogFactory; import org.togglz.core.repository.FeatureState; import org.togglz.core.spi.ActivationStrategy; import org.togglz.core.user.FeatureUser; import org.togglz.core.util.Strings; /** * Activation strategy that allows to activate features only for certain server IPs. * * @author Eli Abramovitch * @author Christian Kaltepoth */ public class ServerIpActivationStrategy implements ActivationStrategy { private final Log log = LogFactory.getLog(ServerIpActivationStrategy.class); public static final String ID = "server-ip"; public static final String PARAM_IPS = "ips"; private final Set<String> ipAddresses = new HashSet<String>(); public ServerIpActivationStrategy() { try { Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces(); if (interfaces != null) { while (interfaces.hasMoreElements()) { Enumeration<InetAddress> addresses = interfaces.nextElement().getInetAddresses(); if (addresses != null) { while (addresses.hasMoreElements()) { String hostAddress = addresses.nextElement().getHostAddress(); if (hostAddress != null) { ipAddresses.add(hostAddress); } } } } } } catch (SocketException e) { log.error("Unable to find IP addresses: " + e.getMessage()); } } @Override public String getId() { return ID; } @Override public String getName() { return "IP address (server)"; } @Override public boolean isActive(FeatureState featureState, FeatureUser user) { String allowedIpsParam = featureState.getParameter(PARAM_IPS); if (Strings.isNotBlank(allowedIpsParam)) { List<String> allowedIps = Strings.splitAndTrim(allowedIpsParam, "[\\s,]+"); for (String allowedIp : allowedIps) { if (ipAddresses.contains(allowedIp)) { return true; } } } return false; } @Override public Parameter[] getParameters() { return new Parameter[] { ParameterBuilder.create(PARAM_IPS).label("Server IPs") .description("A comma-separated list of server IPs for which the feature should be active.") }; } }