package com.limegroup.gnutella.filters; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import com.limegroup.gnutella.Response; import com.limegroup.gnutella.messages.BadPacketException; import com.limegroup.gnutella.messages.Message; import com.limegroup.gnutella.messages.QueryReply; import com.limegroup.gnutella.messages.QueryRequest; /** * A spam filter that removes certain "bad" keywords. * If <i>any</i> words in a query are in the banned set, the * query is disallowed. */ public class KeywordFilter extends SpamFilter { /** INVARIANT: strings in ban contain only lowercase */ private List /* of String */ ban=new ArrayList(); /** * @modifies this * @effects bans the given phrase. Capitalization does not matter. */ public void disallow(String phrase) { String canonical = phrase.toLowerCase(); if (!ban.contains(canonical)) ban.add(canonical); } /** * @modifies this * @effects bans several well-known "adult" words. */ public void disallowAdult() { disallow("anal"); disallow("anul"); disallow("asshole"); disallow("blow"); disallow("blowjob"); disallow("bondage"); disallow("centerfold"); disallow("cock"); disallow("cum"); disallow("cunt"); disallow("facial"); disallow("fuck"); disallow("gangbang"); disallow("hentai"); disallow("incest"); disallow("jenna"); disallow("masturbat"); disallow("nipple"); disallow("penis"); disallow("playboy"); disallow("porn"); disallow("pussy"); disallow("rape"); disallow("sex"); disallow("slut"); disallow("suck"); disallow("tittie"); disallow("titty"); disallow("twat"); disallow("vagina"); disallow("whore"); disallow("xxx"); } /** * @modifies this * @effects bans .vbs files */ public void disallowVbs() { disallow(".vbs"); } /** * @modifies this * @effects bans .htm and html files */ public void disallowHtml() { disallow(".htm"); } /** * bans .wmv and .asf files */ public void disallowWMVASF() { disallow(".asf"); disallow(".asx"); disallow(".wmv"); } public boolean allow(Message m) { boolean ok=true; if (m instanceof QueryRequest) return allow((QueryRequest)m); else if (m instanceof QueryReply) return allow((QueryReply)m); else return ok; } protected boolean allow(QueryRequest qr) { //return false iff any of the words in query are in ban String query=qr.getQuery(); return ! matches(query); } boolean allow(QueryReply qr) { //if any of the file names in qr contain bad words, the whole //thing is disallowed try { for (Iterator iter=qr.getResults(); iter.hasNext(); ) { Response response=(Response)iter.next(); if (matches(response.getName())) return false; } } catch (BadPacketException e) { return false; } return true; } /** * Returns true if phrase matches any of the entries in ban. */ protected boolean matches(String phrase) { String canonical=phrase.toLowerCase(); for (int i=0; i<ban.size(); i++) { String badWord=(String)ban.get(i); //phrase contains badWord? //Hopefully indexOf uses some reasonably efficient //algorithm, such as Knuth-Morris-Pratt. if (canonical.indexOf(badWord)!=-1) return true; } return false; } }