1 31 package org.blojsom.plugin.moderation; 32 33 import org.apache.commons.logging.Log; 34 import org.apache.commons.logging.LogFactory; 35 import org.blojsom.blog.Blog; 36 import org.blojsom.blog.Entry; 37 import org.blojsom.event.Event; 38 import org.blojsom.event.EventBroadcaster; 39 import org.blojsom.event.Listener; 40 import org.blojsom.plugin.Plugin; 41 import org.blojsom.plugin.PluginException; 42 import org.blojsom.plugin.comment.CommentModerationPlugin; 43 import org.blojsom.plugin.comment.CommentPlugin; 44 import org.blojsom.plugin.comment.event.CommentResponseSubmissionEvent; 45 import org.blojsom.plugin.pingback.PingbackPlugin; 46 import org.blojsom.plugin.pingback.event.PingbackResponseSubmissionEvent; 47 import org.blojsom.plugin.response.event.ResponseSubmissionEvent; 48 import org.blojsom.plugin.trackback.TrackbackModerationPlugin; 49 import org.blojsom.plugin.trackback.TrackbackPlugin; 50 import org.blojsom.plugin.trackback.event.TrackbackResponseSubmissionEvent; 51 import org.blojsom.util.BlojsomUtils; 52 53 import javax.servlet.http.HttpServletRequest ; 54 import javax.servlet.http.HttpServletResponse ; 55 import java.io.BufferedReader ; 56 import java.io.IOException ; 57 import java.io.StringReader ; 58 import java.util.ArrayList ; 59 import java.util.Iterator ; 60 import java.util.List ; 61 import java.util.Map ; 62 63 70 public class IPAddressModerationPlugin implements Plugin, Listener { 71 72 private Log _logger = LogFactory.getLog(IPAddressModerationPlugin.class); 73 74 private static final String IP_BLACKLIST_IP = "ip-blacklist"; 75 private static final String IP_WHITELIST_IP = "ip-whitelist"; 76 private static final String DELETE_IPSPAM = "delete-ipspam"; 77 private static final boolean DEFAULT_DELETE_IPSPAM = false; 78 79 private EventBroadcaster _eventBroadcaster; 80 81 84 public IPAddressModerationPlugin() { 85 } 86 87 92 public void setEventBroadcaster(EventBroadcaster eventBroadcaster) { 93 _eventBroadcaster = eventBroadcaster; 94 } 95 96 102 public void init() throws PluginException { 103 _eventBroadcaster.addListener(this); 104 } 105 106 117 public Entry[] process(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Blog blog, Map context, Entry[] entries) throws PluginException { 118 return entries; 119 } 120 121 127 public void cleanup() throws PluginException { 128 } 129 130 136 public void destroy() throws PluginException { 137 } 138 139 144 public void handleEvent(Event event) { 145 } 146 147 154 protected List loadIPList(Blog blog, String property) { 155 ArrayList ipAddresses = new ArrayList (); 156 String ipAddressValues = blog.getProperty(property); 157 158 if (!BlojsomUtils.checkNullOrBlank(ipAddressValues)) { 159 try { 160 BufferedReader br = new BufferedReader (new StringReader (ipAddressValues)); 161 String ipAddress; 162 163 while ((ipAddress = br.readLine()) != null) { 164 ipAddresses.add(ipAddress); 165 } 166 167 br.close(); 168 } catch (IOException e) { 169 if (_logger.isErrorEnabled()) { 170 _logger.error(e); 171 } 172 } 173 } 174 175 return ipAddresses; 176 } 177 178 183 public void processEvent(Event event) { 184 if (event instanceof ResponseSubmissionEvent) { 185 ResponseSubmissionEvent responseSubmissionEvent = (ResponseSubmissionEvent) event; 186 String requestIPAddress = responseSubmissionEvent.getHttpServletRequest().getRemoteAddr(); 187 188 if (!BlojsomUtils.checkNullOrBlank(requestIPAddress)) { 189 boolean ipInWhitelist = false; 190 List ipAddresses = loadIPList(responseSubmissionEvent.getBlog(), IP_WHITELIST_IP); 191 192 if (ipAddresses.size() > 0) { 193 String ipAddress; 194 Iterator ipIterator = ipAddresses.iterator(); 195 196 while (ipIterator.hasNext()) { 197 ipAddress = (String ) ipIterator.next(); 198 if (requestIPAddress.matches(ipAddress) || requestIPAddress.indexOf(ipAddress) != -1) { 199 if (_logger.isDebugEnabled()) { 200 _logger.debug("IP address found in whitelist: " + requestIPAddress); 201 } 202 203 ipInWhitelist = true; 204 break; 205 } 206 } 207 } else { 208 if (_logger.isDebugEnabled()) { 209 _logger.debug("IP address whitelist not populated"); 210 } 211 } 212 213 ipAddresses = loadIPList(responseSubmissionEvent.getBlog(), IP_BLACKLIST_IP); 214 if (ipAddresses.size() > 0 && !ipInWhitelist) { 215 String ipAddress; 216 Iterator ipIterator = ipAddresses.iterator(); 217 218 boolean deleteIPSpam = DEFAULT_DELETE_IPSPAM; 219 Map metaData = responseSubmissionEvent.getMetaData(); 220 221 String deleteIPSpamValue = responseSubmissionEvent.getBlog().getProperty(DELETE_IPSPAM); 222 if (!BlojsomUtils.checkNullOrBlank(deleteIPSpamValue)) { 223 deleteIPSpam = Boolean.valueOf(deleteIPSpamValue).booleanValue(); 224 } 225 226 boolean ipSpamFound = false; 227 while (ipIterator.hasNext()) { 228 ipAddress = (String ) ipIterator.next(); 229 if (requestIPAddress.matches(ipAddress) || requestIPAddress.indexOf(ipAddress) != -1) { 230 if (_logger.isDebugEnabled()) { 231 _logger.debug("IP address found in blacklist: " + requestIPAddress); 232 } 233 234 ipSpamFound = true; 235 break; 236 } 237 } 238 239 if (ipSpamFound) { 240 if (!deleteIPSpam) { 241 if (_logger.isDebugEnabled()) { 242 _logger.debug("Marking response for moderation"); 243 } 244 } else { 245 if (_logger.isDebugEnabled()) { 246 _logger.debug("Marking response for automatic deletion"); 247 } 248 } 249 250 if (responseSubmissionEvent instanceof CommentResponseSubmissionEvent) { 251 if (!deleteIPSpam) { 252 metaData.put(CommentModerationPlugin.BLOJSOM_COMMENT_MODERATION_PLUGIN_APPROVED, Boolean.FALSE.toString()); 253 } else { 254 metaData.put(CommentPlugin.BLOJSOM_PLUGIN_COMMENT_METADATA_DESTROY, Boolean.TRUE); 255 } 256 } else if (responseSubmissionEvent instanceof TrackbackResponseSubmissionEvent) { 257 if (!deleteIPSpam) { 258 metaData.put(TrackbackModerationPlugin.BLOJSOM_TRACKBACK_MODERATION_PLUGIN_APPROVED, Boolean.FALSE.toString()); 259 } else { 260 metaData.put(TrackbackPlugin.BLOJSOM_PLUGIN_TRACKBACK_METADATA_DESTROY, Boolean.TRUE); 261 } 262 } else if (responseSubmissionEvent instanceof PingbackResponseSubmissionEvent) { 263 if (deleteIPSpam) { 264 metaData.put(PingbackPlugin.BLOJSOM_PLUGIN_PINGBACK_METADATA_DESTROY, Boolean.TRUE); 265 } 266 } 267 } 268 } else { 269 if (_logger.isDebugEnabled()) { 270 _logger.debug("IP address blacklist not populated"); 271 } 272 } 273 } else { 274 if (_logger.isDebugEnabled()) { 275 _logger.debug("IP address not available"); 276 } 277 } 278 } 279 } 280 } | Popular Tags |