package com.limegroup.gnutella.filters; import java.util.Collection; import java.util.List; import java.util.Locale; import org.limewire.core.api.search.SearchResult; import org.limewire.core.settings.FilterSettings; import com.google.common.collect.ImmutableList; import com.limegroup.gnutella.Response; import com.limegroup.gnutella.filters.response.ResponseFilter; import com.limegroup.gnutella.filters.response.SearchResultFilter; import com.limegroup.gnutella.messages.Message; import com.limegroup.gnutella.messages.QueryReply; import com.limegroup.gnutella.messages.QueryRequest; import com.limegroup.gnutella.xml.LimeXMLDocument; /** * A filter that blocks queries and responses matching certain banned keywords. */ public class KeywordFilter implements SpamFilter, ResponseFilter, SearchResultFilter { static final String[] ADULT_WORDS = { "adult", "anal", "anul", "ass", "boob", "blow", "bondage", "centerfold", "cock", "cum", "cunt", "dick", "dildo", "facial", "fuck", "gangbang", "hentai", "horny", "incest", "jenna", "masturbat", "milf", "nipple", "orgasm", "pedo", "penis", "playboy", "porn", "pussy", "rape", "sex", "slut", "squirt", "stripper", "suck", "tits", "tittie", "titty", "twat", "underage", "vagina", "whore", "xxx" }; /** INVARIANT: strings in ban contain only lowercase */ private final List<String> ban; KeywordFilter() { this(FilterSettings.FILTER_ADULT.getValue(), true); } protected KeywordFilter(boolean banAdult, boolean banPersonal) { ImmutableList.Builder<String> builder = new ImmutableList.Builder<String>(); if(banAdult) { for(String word : ADULT_WORDS) { builder.add(word); } } if(banPersonal) { for(String word : FilterSettings.BANNED_WORDS.get()) { builder.add(word); } for(String ext : FilterSettings.BANNED_EXTENSIONS.get()) { builder.add(ext); } } ban = builder.build(); } KeywordFilter(Collection<String> words) { ImmutableList.Builder<String> builder = new ImmutableList.Builder<String>(); for(String word : words) { builder.add(word.toLowerCase(Locale.US)); } ban = builder.build(); } @Override // SpamFilter public boolean allow(Message m) { if (m instanceof QueryRequest) return !matches(((QueryRequest)m).getQuery()); else return true; } @Override // ResponseFilter public boolean allow(QueryReply qr, Response response) { return !matches(response.getName()); } @Override // ResultFilter public boolean allow(SearchResult result, LimeXMLDocument document) { return !matches(result.getFileNameWithoutExtension()); } /** * Returns true if phrase matches any of the banned words. */ protected boolean matches(String phrase) { String canonical = phrase.toLowerCase(Locale.US); for(String word : ban) { if(canonical.indexOf(word) != -1) return true; } return false; } }