IPAddressModerationPlugin.java [plain text]
package org.blojsom.plugin.moderation;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.blojsom.blog.BlogEntry;
import org.blojsom.blog.BlogUser;
import org.blojsom.blog.BlojsomConfiguration;
import org.blojsom.event.BlojsomEvent;
import org.blojsom.event.BlojsomListener;
import org.blojsom.plugin.BlojsomPlugin;
import org.blojsom.plugin.BlojsomPluginException;
import org.blojsom.plugin.comment.CommentModerationPlugin;
import org.blojsom.plugin.comment.CommentPlugin;
import org.blojsom.plugin.comment.event.CommentResponseSubmissionEvent;
import org.blojsom.plugin.response.event.ResponseSubmissionEvent;
import org.blojsom.plugin.trackback.TrackbackModerationPlugin;
import org.blojsom.plugin.trackback.TrackbackPlugin;
import org.blojsom.plugin.trackback.event.TrackbackResponseSubmissionEvent;
import org.blojsom.util.BlojsomConstants;
import org.blojsom.util.BlojsomUtils;
import javax.servlet.ServletConfig;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Map;
public class IPAddressModerationPlugin implements BlojsomPlugin, BlojsomListener {
private Log _logger = LogFactory.getLog(IPAddressModerationPlugin.class);
private static final String IP_BLACKLIST_IP = "ip-blacklist";
private static final String IP_WHITELIST_IP = "ip-whitelist";
private static final String DEFAULT_IP_BLACKLIST_FILE = "ip-blacklist.properties";
private static final String DEFAULT_IP_WHITELIST_FILE = "ip-whitelist.properties";
private static final String DELETE_IPSPAM = "delete-ipspam";
private static final boolean DEFAULT_DELETE_IPSPAM = false;
private BlojsomConfiguration _blojsomConfiguration;
private String _ipBlacklist = DEFAULT_IP_BLACKLIST_FILE;
private String _ipWhitelist = DEFAULT_IP_WHITELIST_FILE;
public IPAddressModerationPlugin() {
}
public void init(ServletConfig servletConfig, BlojsomConfiguration blojsomConfiguration) throws BlojsomPluginException {
blojsomConfiguration.getEventBroadcaster().addListener(this);
_blojsomConfiguration = blojsomConfiguration;
String ipBlacklist = servletConfig.getInitParameter(IP_BLACKLIST_IP);
if (!BlojsomUtils.checkNullOrBlank(ipBlacklist)) {
_ipBlacklist = ipBlacklist;
}
String ipWhitelist = servletConfig.getInitParameter(IP_WHITELIST_IP);
if (!BlojsomUtils.checkNullOrBlank(ipWhitelist)) {
_ipWhitelist = ipWhitelist;
}
_logger.debug("Initialized IP address blacklist/whitelist plugin");
}
public BlogEntry[] process(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, BlogUser user, Map context, BlogEntry[] entries) throws BlojsomPluginException {
return entries;
}
public void cleanup() throws BlojsomPluginException {
}
public void destroy() throws BlojsomPluginException {
}
public void handleEvent(BlojsomEvent event) {
}
public void processEvent(BlojsomEvent event) {
if (event instanceof ResponseSubmissionEvent) {
ResponseSubmissionEvent responseSubmissionEvent = (ResponseSubmissionEvent) event;
String requestIPAddress = responseSubmissionEvent.getHttpServletRequest().getRemoteAddr();
if (!BlojsomUtils.checkNullOrBlank(requestIPAddress)) {
File blacklistFile = new File(_blojsomConfiguration.getInstallationDirectory() + _blojsomConfiguration.getBaseConfigurationDirectory() + "/" +
responseSubmissionEvent.getBlog().getId() + "/" + _ipBlacklist);
File whitelistFile = new File(_blojsomConfiguration.getInstallationDirectory() + _blojsomConfiguration.getBaseConfigurationDirectory() + "/" +
responseSubmissionEvent.getBlog().getId() + "/" + _ipWhitelist);
boolean ipInWhitelist = false;
if (whitelistFile.exists()) {
try {
FileInputStream fis = new FileInputStream(whitelistFile);
BufferedReader br = new BufferedReader(new InputStreamReader(fis, BlojsomConstants.UTF8));
ArrayList ipAddresses = new ArrayList(25);
String ipAddress;
while ((ipAddress = br.readLine()) != null) {
ipAddresses.add(ipAddress);
}
br.close();
Iterator ipIterator = ipAddresses.iterator();
while (ipIterator.hasNext()) {
ipAddress = (String) ipIterator.next();
if (requestIPAddress.matches(ipAddress) || requestIPAddress.indexOf(ipAddress) != -1) {
_logger.debug("IP address found in whitelist: " + requestIPAddress);
ipInWhitelist = true;
break;
}
}
} catch (IOException e) {
_logger.error(e);
}
} else {
_logger.debug("IP address whitelist not found: " + _ipWhitelist);
}
if (blacklistFile.exists() && !ipInWhitelist) {
try {
FileInputStream fis = new FileInputStream(blacklistFile);
BufferedReader br = new BufferedReader(new InputStreamReader(fis, BlojsomConstants.UTF8));
ArrayList ipAddresses = new ArrayList(25);
String ipAddress;
while ((ipAddress = br.readLine()) != null) {
ipAddresses.add(ipAddress);
}
br.close();
Iterator ipIterator = ipAddresses.iterator();
boolean deleteIPSpam = DEFAULT_DELETE_IPSPAM;
Map metaData = responseSubmissionEvent.getMetaData();
String deleteIPSpamValue = responseSubmissionEvent.getBlog().getBlog().getBlogProperty(DELETE_IPSPAM);
if (!BlojsomUtils.checkNullOrBlank(deleteIPSpamValue)) {
deleteIPSpam = Boolean.valueOf(deleteIPSpamValue).booleanValue();
}
boolean ipSpamFound = false;
while (ipIterator.hasNext()) {
ipAddress = (String) ipIterator.next();
if (requestIPAddress.matches(ipAddress) || requestIPAddress.indexOf(ipAddress) != -1) {
_logger.debug("IP address found in blacklist: " + requestIPAddress);
ipSpamFound = true;
break;
}
}
if (ipSpamFound) {
if (!deleteIPSpam) {
_logger.debug("Marking response for moderation");
} else {
_logger.debug("Marking response for automatic deletion");
}
if (responseSubmissionEvent instanceof CommentResponseSubmissionEvent) {
if (!deleteIPSpam) {
metaData.put(CommentModerationPlugin.BLOJSOM_COMMENT_MODERATION_PLUGIN_APPROVED, Boolean.FALSE.toString());
} else {
metaData.put(CommentPlugin.BLOJSOM_PLUGIN_COMMENT_METADATA_DESTROY, Boolean.TRUE);
}
} else if (responseSubmissionEvent instanceof TrackbackResponseSubmissionEvent) {
if (!deleteIPSpam) {
metaData.put(TrackbackModerationPlugin.BLOJSOM_TRACKBACK_MODERATION_PLUGIN_APPROVED, Boolean.FALSE.toString());
} else {
metaData.put(TrackbackPlugin.BLOJSOM_PLUGIN_TRACKBACK_METADATA_DESTROY, Boolean.TRUE);
}
}
}
} catch (IOException e) {
_logger.error(e);
}
} else {
_logger.debug("IP address blacklist not found: " + _ipWhitelist);
}
} else {
_logger.debug("IP address not available");
}
}
}
}