R4SAS
6 years ago
16 changed files with 9 additions and 48441 deletions
File diff suppressed because it is too large
Load Diff
@ -1,197 +0,0 @@ |
|||||||
package org.purplei2p.lightning.adblock; |
|
||||||
|
|
||||||
import android.app.Application; |
|
||||||
import android.content.res.AssetManager; |
|
||||||
import android.support.annotation.NonNull; |
|
||||||
import android.support.annotation.Nullable; |
|
||||||
import android.util.Log; |
|
||||||
|
|
||||||
import com.anthonycr.bonsai.Completable; |
|
||||||
import com.anthonycr.bonsai.CompletableAction; |
|
||||||
import com.anthonycr.bonsai.CompletableSubscriber; |
|
||||||
import com.anthonycr.bonsai.Schedulers; |
|
||||||
|
|
||||||
import java.io.BufferedReader; |
|
||||||
import java.io.IOException; |
|
||||||
import java.io.InputStreamReader; |
|
||||||
import java.net.URI; |
|
||||||
import java.net.URISyntaxException; |
|
||||||
import java.util.ArrayList; |
|
||||||
import java.util.HashSet; |
|
||||||
import java.util.List; |
|
||||||
import java.util.Set; |
|
||||||
|
|
||||||
import javax.inject.Inject; |
|
||||||
import javax.inject.Singleton; |
|
||||||
|
|
||||||
import org.purplei2p.lightning.BuildConfig; |
|
||||||
import org.purplei2p.lightning.preference.PreferenceManager; |
|
||||||
import org.purplei2p.lightning.utils.StringBuilderUtils; |
|
||||||
import org.purplei2p.lightning.utils.Utils; |
|
||||||
|
|
||||||
@Singleton |
|
||||||
public class AdBlock { |
|
||||||
|
|
||||||
private static final String TAG = "AdBlock"; |
|
||||||
private static final String BLOCKED_DOMAINS_LIST_FILE_NAME = "hosts.txt"; |
|
||||||
private static final String LOCAL_IP_V4 = "127.0.0.1"; |
|
||||||
private static final String LOCAL_IP_V4_ALT = "0.0.0.0"; |
|
||||||
private static final String LOCAL_IP_V6 = "::1"; |
|
||||||
private static final String LOCALHOST = "localhost"; |
|
||||||
private static final String COMMENT = "#"; |
|
||||||
private static final String TAB = "\t"; |
|
||||||
private static final String SPACE = " "; |
|
||||||
private static final String EMPTY = ""; |
|
||||||
|
|
||||||
@NonNull private final Set<String> mBlockedDomainsList = new HashSet<>(); |
|
||||||
@NonNull private final PreferenceManager mPreferenceManager; |
|
||||||
@NonNull private final Application mApplication; |
|
||||||
private boolean mBlockAds; |
|
||||||
|
|
||||||
@Inject |
|
||||||
AdBlock(@NonNull Application application, @NonNull PreferenceManager preferenceManager) { |
|
||||||
mApplication = application; |
|
||||||
mPreferenceManager = preferenceManager; |
|
||||||
if (mBlockedDomainsList.isEmpty() && BuildConfig.FULL_VERSION) { |
|
||||||
loadHostsFile().subscribeOn(Schedulers.io()).subscribe(); |
|
||||||
} |
|
||||||
mBlockAds = mPreferenceManager.getAdBlockEnabled(); |
|
||||||
} |
|
||||||
|
|
||||||
public void updatePreference() { |
|
||||||
mBlockAds = mPreferenceManager.getAdBlockEnabled(); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* a method that determines if the given URL is an ad or not. It performs |
|
||||||
* a search of the URL's domain on the blocked domain hash set. |
|
||||||
* |
|
||||||
* @param url the URL to check for being an ad |
|
||||||
* @return true if it is an ad, false if it is not an ad |
|
||||||
*/ |
|
||||||
public boolean isAd(@Nullable String url) { |
|
||||||
if (!mBlockAds || url == null) { |
|
||||||
return false; |
|
||||||
} |
|
||||||
|
|
||||||
String domain; |
|
||||||
try { |
|
||||||
domain = getDomainName(url); |
|
||||||
} catch (URISyntaxException e) { |
|
||||||
Log.d(TAG, "URL '" + url + "' is invalid", e); |
|
||||||
return false; |
|
||||||
} |
|
||||||
|
|
||||||
boolean isOnBlacklist = mBlockedDomainsList.contains(domain); |
|
||||||
if (isOnBlacklist) { |
|
||||||
Log.d(TAG, "URL '" + url + "' is an ad"); |
|
||||||
} |
|
||||||
return isOnBlacklist; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Returns the probable domain name for a given URL |
|
||||||
* |
|
||||||
* @param url the url to parse |
|
||||||
* @return returns the domain |
|
||||||
* @throws URISyntaxException throws an exception if the string cannot form a URI |
|
||||||
*/ |
|
||||||
@NonNull |
|
||||||
private static String getDomainName(@NonNull String url) throws URISyntaxException { |
|
||||||
int index = url.indexOf('/', 8); |
|
||||||
if (index != -1) { |
|
||||||
url = url.substring(0, index); |
|
||||||
} |
|
||||||
|
|
||||||
URI uri = new URI(url); |
|
||||||
String domain = uri.getHost(); |
|
||||||
if (domain == null) { |
|
||||||
return url; |
|
||||||
} |
|
||||||
|
|
||||||
return domain.startsWith("www.") ? domain.substring(4) : domain; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* This Completable reads through a hosts file and extracts the domains that should |
|
||||||
* be redirected to localhost (a.k.a. IP address 127.0.0.1). It can handle files that |
|
||||||
* simply have a list of host names to block, or it can handle a full blown hosts file. |
|
||||||
* It will strip out comments, references to the base IP address and just extract the |
|
||||||
* domains to be used. |
|
||||||
* |
|
||||||
* @return a Completable that will load the hosts file into memory. |
|
||||||
*/ |
|
||||||
@NonNull |
|
||||||
private Completable loadHostsFile() { |
|
||||||
return Completable.create(new CompletableAction() { |
|
||||||
@Override |
|
||||||
public void onSubscribe(@NonNull CompletableSubscriber subscriber) { |
|
||||||
AssetManager asset = mApplication.getAssets(); |
|
||||||
BufferedReader reader = null; |
|
||||||
//noinspection TryFinallyCanBeTryWithResources
|
|
||||||
try { |
|
||||||
reader = new BufferedReader(new InputStreamReader( |
|
||||||
asset.open(BLOCKED_DOMAINS_LIST_FILE_NAME))); |
|
||||||
StringBuilder lineBuilder = new StringBuilder(); |
|
||||||
String line; |
|
||||||
long time = System.currentTimeMillis(); |
|
||||||
|
|
||||||
final List<String> domains = new ArrayList<>(1); |
|
||||||
|
|
||||||
while ((line = reader.readLine()) != null) { |
|
||||||
lineBuilder.append(line); |
|
||||||
|
|
||||||
parseString(lineBuilder, domains); |
|
||||||
lineBuilder.setLength(0); |
|
||||||
} |
|
||||||
|
|
||||||
mBlockedDomainsList.addAll(domains); |
|
||||||
Log.d(TAG, "Loaded ad list in: " + (System.currentTimeMillis() - time) + " ms"); |
|
||||||
} catch (IOException e) { |
|
||||||
Log.wtf(TAG, "Reading blocked domains list from file '" |
|
||||||
+ BLOCKED_DOMAINS_LIST_FILE_NAME + "' failed.", e); |
|
||||||
} finally { |
|
||||||
Utils.close(reader); |
|
||||||
} |
|
||||||
} |
|
||||||
}); |
|
||||||
} |
|
||||||
|
|
||||||
private static void parseString(@NonNull StringBuilder lineBuilder, @NonNull List<String> parsedList) { |
|
||||||
if (!StringBuilderUtils.isEmpty(lineBuilder) && |
|
||||||
!StringBuilderUtils.startsWith(lineBuilder, COMMENT)) { |
|
||||||
StringBuilderUtils.replace(lineBuilder, LOCAL_IP_V4, EMPTY); |
|
||||||
StringBuilderUtils.replace(lineBuilder, LOCAL_IP_V4_ALT, EMPTY); |
|
||||||
StringBuilderUtils.replace(lineBuilder, LOCAL_IP_V6, EMPTY); |
|
||||||
StringBuilderUtils.replace(lineBuilder, TAB, EMPTY); |
|
||||||
|
|
||||||
int comment = lineBuilder.indexOf(COMMENT); |
|
||||||
if (comment >= 0) { |
|
||||||
lineBuilder.replace(comment, lineBuilder.length(), EMPTY); |
|
||||||
} |
|
||||||
|
|
||||||
StringBuilderUtils.trim(lineBuilder); |
|
||||||
|
|
||||||
if (!StringBuilderUtils.isEmpty(lineBuilder) && |
|
||||||
!StringBuilderUtils.equals(lineBuilder, LOCALHOST)) { |
|
||||||
while (StringBuilderUtils.contains(lineBuilder, SPACE)) { |
|
||||||
int space = lineBuilder.indexOf(SPACE); |
|
||||||
StringBuilder partial = StringBuilderUtils.substring(lineBuilder, 0, space); |
|
||||||
StringBuilderUtils.trim(partial); |
|
||||||
|
|
||||||
String partialLine = partial.toString(); |
|
||||||
|
|
||||||
// Add string to list
|
|
||||||
parsedList.add(partialLine); |
|
||||||
StringBuilderUtils.replace(lineBuilder, partialLine, EMPTY); |
|
||||||
StringBuilderUtils.trim(lineBuilder); |
|
||||||
} |
|
||||||
if (lineBuilder.length() > 0) { |
|
||||||
// Add string to list.
|
|
||||||
parsedList.add(lineBuilder.toString()); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
Loading…
Reference in new issue