package com.limegroup.gnutella.filters;
import java.util.ArrayList;
import org.limewire.core.settings.FilterSettings;
import com.google.inject.Inject;
import com.google.inject.Provider;
import com.google.inject.Singleton;
@Singleton
class SpamFilterFactoryImpl implements SpamFilterFactory {
private final Provider<HostileFilter> hostileFilter;
private final Provider<LocalIPFilter> ipFilter;
private final Provider<URNFilter> urnFilter;
private final Provider<RepetitiveQueryFilter> repetitiveQueryFilter;
private final Provider<SameAltLocsFilter> sameAltLocsFilter;
@Inject
public SpamFilterFactoryImpl(Provider<HostileFilter> hostileFilter,
Provider<LocalIPFilter> ipFilter,
Provider<URNFilter> urnFilter,
Provider<RepetitiveQueryFilter> repetitiveQueryFilter,
Provider<SameAltLocsFilter> sameAltLocsFilter) {
this.hostileFilter = hostileFilter;
this.ipFilter = ipFilter;
this.urnFilter = urnFilter;
this.repetitiveQueryFilter = repetitiveQueryFilter;
this.sameAltLocsFilter = sameAltLocsFilter;
}
/* (non-Javadoc)
* @see com.limegroup.gnutella.filters.SpamFilterFactory#createPersonalFilter()
*/
public SpamFilter createPersonalFilter() {
ArrayList<SpamFilter> buf = new ArrayList<SpamFilter>();
//1. Hostile and locally blacklisted IP addresses.
LocalIPFilter ipFilter = this.ipFilter.get();
if(ipFilter.hasBlacklistedHosts())
buf.add(ipFilter);
//2. Queries matching banned keywords (responses are handled by the
// ResponseFilter pipeline to avoid dropping messages with a mixture
// of matching and non-matching responses).
buf.add(new KeywordFilter());
buf.add(new PhraseFilter());
//3. Spammy replies. (TODO: do these still exist?)
buf.add(new SpamReplyFilter());
//4. URN filter.
if(FilterSettings.FILTER_URNS.getValue())
buf.add(urnFilter.get());
//5. Query replies in which every response has similar alt-locs.
buf.add(sameAltLocsFilter.get());
return compose(buf);
}
/* (non-Javadoc)
* @see com.limegroup.gnutella.filters.SpamFilterFactory#createRouteFilter()
*/
public SpamFilter createRouteFilter() {
//Assemble spam filters. Order matters a little bit.
ArrayList<SpamFilter> buf = new ArrayList<SpamFilter>();
//1. Eliminate old LimeWire requeries. (TODO: do these still exist?)
buf.add(new RequeryFilter());
//1b. Eliminate runaway Qtrax queries. (TODO: do these still exist?)
buf.add(new GUIDFilter());
//2. Duplicate-based techniques.
if (FilterSettings.FILTER_DUPLICATES.getValue()) {
buf.add(new DuplicateFilter());
buf.add(repetitiveQueryFilter.get());
}
//3. Greedy queries. Yes, this is a route filter issue.
if (FilterSettings.FILTER_GREEDY_QUERIES.getValue())
buf.add(new GreedyQueryFilter());
//4. Queries containing hash urns.
if (FilterSettings.FILTER_HASH_QUERIES.getValue())
buf.add(new HashFilter());
//5. Hostile IP addresses.
buf.add(hostileFilter.get());
//6. Query replies with suspicious GUIDs.
if (FilterSettings.CLIENT_GUID_FILTER.getValue())
buf.add(new ClientGuidFilter());
return compose(buf);
}
/**
* Returns a composite filter of the given filters.
* @param filters a ArrayList of SpamFilter.
*/
private static SpamFilter compose(ArrayList<? extends SpamFilter> filters) {
//As a minor optimization, we avoid a few method calls in
//special cases.
if (filters.size()==0)
return new AllowFilter();
else if (filters.size()==1)
return filters.get(0);
else {
SpamFilter[] delegates = new SpamFilter[filters.size()];
return new CompositeFilter(filters.toArray(delegates));
}
}
}