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.pingback.event.PingbackResponseSubmissionEvent; 43 import org.blojsom.plugin.pingback.PingbackPlugin; 44 import org.blojsom.plugin.comment.CommentModerationPlugin; 45 import org.blojsom.plugin.comment.CommentPlugin; 46 import org.blojsom.plugin.comment.event.CommentResponseSubmissionEvent; 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.util.Map ; 56 import java.util.regex.Matcher ; 57 import java.util.regex.Pattern ; 58 59 66 public class LinkSpamModerationPlugin implements Plugin, Listener { 67 68 private Log _logger = LogFactory.getLog(LinkSpamModerationPlugin.class); 69 70 private static final Pattern LINK_PATTERN = Pattern.compile("<a.*?href=.*?>", Pattern.UNICODE_CASE | Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL); 71 private static final String LINKSPAM_COMMENT_THRESHOLD = "linkspam-comment-threshold"; 72 private static final String LINKSPAM_TRACKBACK_THRESHOLD = "linkspam-trackback-threshold"; 73 private static final String DELETE_LINKSPAM = "delete-linkspam"; 74 75 private static final int DEFAULT_LINK_THRESHOLD = 3; 76 77 private EventBroadcaster _eventBroadcaster; 78 79 82 public LinkSpamModerationPlugin() { 83 } 84 85 90 public void setEventBroadcaster(EventBroadcaster eventBroadcaster) { 91 _eventBroadcaster = eventBroadcaster; 92 } 93 94 100 public void init() throws PluginException { 101 _eventBroadcaster.addListener(this); 102 } 103 104 115 public Entry[] process(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Blog blog, Map context, Entry[] entries) throws PluginException { 116 return entries; 117 } 118 119 125 public void cleanup() throws PluginException { 126 127 } 128 129 135 public void destroy() throws PluginException { 136 137 } 138 139 144 public void handleEvent(Event event) { 145 146 } 147 148 153 public void processEvent(Event event) { 154 if (event instanceof ResponseSubmissionEvent) { 155 ResponseSubmissionEvent responseSubmissionEvent = (ResponseSubmissionEvent) event; 156 String text = responseSubmissionEvent.getContent(); 157 Map metaData = responseSubmissionEvent.getMetaData(); 158 159 if (!BlojsomUtils.checkNullOrBlank(text)) { 160 Matcher linkMatcher = LINK_PATTERN.matcher(text); 161 int linkCount = 0; 162 163 while (linkMatcher.find()) { 164 linkCount++; 165 } 166 167 int linkThreshold; 168 String thresholdProperty = ""; 169 170 if (responseSubmissionEvent instanceof CommentResponseSubmissionEvent) { 171 thresholdProperty = LINKSPAM_COMMENT_THRESHOLD; 172 } else if (responseSubmissionEvent instanceof TrackbackResponseSubmissionEvent) { 173 thresholdProperty = LINKSPAM_TRACKBACK_THRESHOLD; 174 } 175 176 String thresholdPropertyValue = responseSubmissionEvent.getBlog().getProperty(thresholdProperty); 177 if (BlojsomUtils.checkNullOrBlank(thresholdPropertyValue)) { 178 thresholdPropertyValue = Integer.toString(DEFAULT_LINK_THRESHOLD); 179 } 180 181 String deleteLinkSpamPropertyValue = responseSubmissionEvent.getBlog().getProperty(DELETE_LINKSPAM); 182 boolean deleteLinkSpam; 183 184 try { 185 linkThreshold = Integer.parseInt(thresholdPropertyValue); 186 } catch (NumberFormatException e) { 187 linkThreshold = DEFAULT_LINK_THRESHOLD; 188 } 189 190 deleteLinkSpam = Boolean.valueOf(deleteLinkSpamPropertyValue).booleanValue(); 191 192 if (linkCount >= linkThreshold) { 193 _logger.debug("Exceeded threshold for links in response: " + linkCount + " > " + linkThreshold); 194 195 if (responseSubmissionEvent instanceof CommentResponseSubmissionEvent) { 196 if (!deleteLinkSpam) { 197 metaData.put(CommentModerationPlugin.BLOJSOM_COMMENT_MODERATION_PLUGIN_APPROVED, Boolean.FALSE.toString()); 198 } else { 199 metaData.put(CommentPlugin.BLOJSOM_PLUGIN_COMMENT_METADATA_DESTROY, Boolean.TRUE); 200 } 201 } else if (responseSubmissionEvent instanceof TrackbackResponseSubmissionEvent) { 202 if (!deleteLinkSpam) { 203 metaData.put(TrackbackModerationPlugin.BLOJSOM_TRACKBACK_MODERATION_PLUGIN_APPROVED, Boolean.FALSE.toString()); 204 } else { 205 metaData.put(TrackbackPlugin.BLOJSOM_PLUGIN_TRACKBACK_METADATA_DESTROY, Boolean.TRUE); 206 } 207 } else if (responseSubmissionEvent instanceof PingbackResponseSubmissionEvent) { 208 if (deleteLinkSpam) { 209 metaData.put(PingbackPlugin.BLOJSOM_PLUGIN_PINGBACK_METADATA_DESTROY, Boolean.TRUE); 210 } 211 } 212 } 213 } 214 215 } 216 } 217 } | Popular Tags |