Skip to content

Commit

Permalink
Add support to remove identifying headers, add support for DNT header…
Browse files Browse the repository at this point in the history
… requests
  • Loading branch information
anthonycr committed Oct 31, 2015
1 parent 4e3193b commit 7a0c79d
Show file tree
Hide file tree
Showing 7 changed files with 114 additions and 47 deletions.
Expand Up @@ -528,7 +528,10 @@ public boolean onPreferenceClick(Preference preference) {

@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
boolean checked = (Boolean) newValue;
boolean checked = false;
if (newValue instanceof Boolean) {
checked = (Boolean) newValue;
}
switch (preference.getKey()) {
case SETTINGS_FLASH:
if (!Utils.isFlashInstalled(mActivity) && checked) {
Expand Down
Expand Up @@ -17,6 +17,7 @@
import acr.browser.lightning.R;
import acr.browser.lightning.utils.Utils;
import acr.browser.lightning.utils.WebUtils;
import acr.browser.lightning.view.LightningView;

public class PrivacySettingsFragment extends LightningPreferenceFragment implements Preference.OnPreferenceClickListener, Preference.OnPreferenceChangeListener {

Expand All @@ -31,10 +32,10 @@ public class PrivacySettingsFragment extends LightningPreferenceFragment impleme
private static final String SETTINGS_CLEARCOOKIES = "clear_cookies";
private static final String SETTINGS_CLEARWEBSTORAGE = "clear_webstorage";
private static final String SETTINGS_WEBSTORAGEEXIT = "clear_webstorage_exit";
private static final String SETTINGS_DONOTTRACK = "do_not_track";
private static final String SETTINGS_INVASIVEHEADERS = "remove_identifying_headers";

private Activity mActivity;
private CheckBoxPreference cblocation, cb3cookies, cbsavepasswords, cbcacheexit, cbhistoryexit,
cbcookiesexit, cbwebstorageexit;
private Handler messageHandler;

@Override
Expand All @@ -54,13 +55,15 @@ private void initPrefs() {
Preference clearcookies = findPreference(SETTINGS_CLEARCOOKIES);
Preference clearwebstorage = findPreference(SETTINGS_CLEARWEBSTORAGE);

cblocation = (CheckBoxPreference) findPreference(SETTINGS_LOCATION);
cb3cookies = (CheckBoxPreference) findPreference(SETTINGS_THIRDPCOOKIES);
cbsavepasswords = (CheckBoxPreference) findPreference(SETTINGS_SAVEPASSWORD);
cbcacheexit = (CheckBoxPreference) findPreference(SETTINGS_CACHEEXIT);
cbhistoryexit = (CheckBoxPreference) findPreference(SETTINGS_HISTORYEXIT);
cbcookiesexit = (CheckBoxPreference) findPreference(SETTINGS_COOKIEEXIT);
cbwebstorageexit = (CheckBoxPreference) findPreference(SETTINGS_WEBSTORAGEEXIT);
CheckBoxPreference cblocation = (CheckBoxPreference) findPreference(SETTINGS_LOCATION);
CheckBoxPreference cb3cookies = (CheckBoxPreference) findPreference(SETTINGS_THIRDPCOOKIES);
CheckBoxPreference cbsavepasswords = (CheckBoxPreference) findPreference(SETTINGS_SAVEPASSWORD);
CheckBoxPreference cbcacheexit = (CheckBoxPreference) findPreference(SETTINGS_CACHEEXIT);
CheckBoxPreference cbhistoryexit = (CheckBoxPreference) findPreference(SETTINGS_HISTORYEXIT);
CheckBoxPreference cbcookiesexit = (CheckBoxPreference) findPreference(SETTINGS_COOKIEEXIT);
CheckBoxPreference cbwebstorageexit = (CheckBoxPreference) findPreference(SETTINGS_WEBSTORAGEEXIT);
CheckBoxPreference cbDoNotTrack = (CheckBoxPreference) findPreference(SETTINGS_DONOTTRACK);
CheckBoxPreference cbIdentifyingHeaders = (CheckBoxPreference) findPreference(SETTINGS_INVASIVEHEADERS);

clearcache.setOnPreferenceClickListener(this);
clearhistory.setOnPreferenceClickListener(this);
Expand All @@ -74,6 +77,8 @@ private void initPrefs() {
cbhistoryexit.setOnPreferenceChangeListener(this);
cbcookiesexit.setOnPreferenceChangeListener(this);
cbwebstorageexit.setOnPreferenceChangeListener(this);
cbDoNotTrack.setOnPreferenceChangeListener(this);
cbIdentifyingHeaders.setOnPreferenceChangeListener(this);

cblocation.setChecked(mPreferenceManager.getLocationEnabled());
cbsavepasswords.setChecked(mPreferenceManager.getSavePasswordsEnabled());
Expand All @@ -82,6 +87,11 @@ private void initPrefs() {
cbcookiesexit.setChecked(mPreferenceManager.getClearCookiesExitEnabled());
cb3cookies.setChecked(mPreferenceManager.getBlockThirdPartyCookiesEnabled());
cbwebstorageexit.setChecked(mPreferenceManager.getClearWebStorageExitEnabled());
cbDoNotTrack.setChecked(mPreferenceManager.getDoNotTrackEnabled());
cbIdentifyingHeaders.setChecked(mPreferenceManager.getRemoveIdentifyingHeadersEnabled());

String identifyingHeadersSummary = LightningView.HEADER_REQUESTED_WITH + ", " + LightningView.HEADER_WAP_PROFILE;
cbIdentifyingHeaders.setSummary(identifyingHeadersSummary);

cb3cookies.setEnabled(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP);

Expand Down Expand Up @@ -194,35 +204,33 @@ private void clearWebStorage() {

@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
// switch preferences
switch (preference.getKey()) {
case SETTINGS_LOCATION:
mPreferenceManager.setLocationEnabled((Boolean) newValue);
cblocation.setChecked((Boolean) newValue);
return true;
case SETTINGS_THIRDPCOOKIES:
mPreferenceManager.setBlockThirdPartyCookiesEnabled((Boolean) newValue);
cb3cookies.setChecked((Boolean) newValue);
return true;
case SETTINGS_SAVEPASSWORD:
mPreferenceManager.setSavePasswordsEnabled((Boolean) newValue);
cbsavepasswords.setChecked((Boolean) newValue);
return true;
case SETTINGS_CACHEEXIT:
mPreferenceManager.setClearCacheExit((Boolean) newValue);
cbcacheexit.setChecked((Boolean) newValue);
return true;
case SETTINGS_HISTORYEXIT:
mPreferenceManager.setClearHistoryExitEnabled((Boolean) newValue);
cbhistoryexit.setChecked((Boolean) newValue);
return true;
case SETTINGS_COOKIEEXIT:
mPreferenceManager.setClearCookiesExitEnabled((Boolean) newValue);
cbcookiesexit.setChecked((Boolean) newValue);
return true;
case SETTINGS_WEBSTORAGEEXIT:
mPreferenceManager.setClearWebStorageExitEnabled((Boolean) newValue);
cbwebstorageexit.setChecked((Boolean) newValue);
return true;
case SETTINGS_DONOTTRACK:
mPreferenceManager.setDoNotTrackEnabled((Boolean) newValue);
return true;
case SETTINGS_INVASIVEHEADERS:
mPreferenceManager.setRemoveIdentifyingHeadersEnabled((Boolean) newValue);
return true;
default:
return false;
Expand Down
Expand Up @@ -51,6 +51,8 @@ private static class Name {
public static final String TEXT_ENCODING = "textEncoding";
public static final String CLEAR_WEBSTORAGE_EXIT = "clearWebStorageExit";
public static final String SHOW_TABS_IN_DRAWER = "showTabsInDrawer";
public static final String DO_NOT_TRACK = "doNotTrack";
public static final String INVASIVE_HEADERS = "removeInvasiveHeaders";

public static final String USE_PROXY = "useProxy";
public static final String PROXY_CHOICE = "proxyChoice";
Expand Down Expand Up @@ -245,6 +247,14 @@ public boolean getShowTabsInDrawer(boolean defaultValue) {
return mPrefs.getBoolean(Name.SHOW_TABS_IN_DRAWER, defaultValue);
}

public boolean getDoNotTrackEnabled() {
return mPrefs.getBoolean(Name.DO_NOT_TRACK, false);
}

public boolean getRemoveIdentifyingHeadersEnabled(){
return mPrefs.getBoolean(Name.INVASIVE_HEADERS, false);
}

private void putBoolean(String name, boolean value) {
mPrefs.edit().putBoolean(name, value).apply();
}
Expand All @@ -257,6 +267,14 @@ private void putString(String name, String value) {
mPrefs.edit().putString(name, value).apply();
}

public void setRemoveIdentifyingHeadersEnabled(boolean enabled){
putBoolean(Name.INVASIVE_HEADERS, enabled);
}

public void setDoNotTrackEnabled(boolean doNotTrack) {
putBoolean(Name.DO_NOT_TRACK, doNotTrack);
}

public void setShowTabsInDrawer(boolean show) {
putBoolean(Name.SHOW_TABS_IN_DRAWER, show);
}
Expand Down
37 changes: 30 additions & 7 deletions app/src/main/java/acr/browser/lightning/view/LightningView.java
Expand Up @@ -18,6 +18,7 @@
import android.os.Message;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.util.ArrayMap;
import android.util.Log;
import android.view.GestureDetector;
import android.view.GestureDetector.SimpleOnGestureListener;
Expand All @@ -37,6 +38,7 @@
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.lang.ref.WeakReference;
import java.util.Map;

import javax.inject.Inject;

Expand All @@ -58,6 +60,10 @@

public class LightningView {

public static final String HEADER_REQUESTED_WITH = "X-Requested-With";
public static final String HEADER_WAP_PROFILE = "X-Wap-Profile";
public static final String HEADER_DNT = "DNT";

final LightningViewTitle mTitle;
private WebView mWebView;
final boolean mIsIncognitoTab;
Expand All @@ -80,6 +86,7 @@ public class LightningView {
0, 0, 0, 1.0f, 0 // alpha
};
private final WebViewHandler mWebViewHandler = new WebViewHandler(this);
private final Map<String, String> mRequestHeaders = new ArrayMap<>();

@Inject
Bus mEventBus;
Expand Down Expand Up @@ -128,7 +135,7 @@ public LightningView(Activity activity, String url, boolean isIncognito) {

if (url != null) {
if (!url.trim().isEmpty()) {
mWebView.loadUrl(url);
mWebView.loadUrl(url, mRequestHeaders);
} else {
// don't load anything, the user is looking for a blank tab
}
Expand All @@ -142,11 +149,11 @@ public void loadHomepage() {
return;
}
if (mHomepage.startsWith("about:home")) {
mWebView.loadUrl(StartPage.getHomepage(mActivity));
mWebView.loadUrl(StartPage.getHomepage(mActivity), mRequestHeaders);
} else if (mHomepage.startsWith("about:bookmarks")) {
loadBookmarkpage();
} else {
mWebView.loadUrl(mHomepage);
mWebView.loadUrl(mHomepage, mRequestHeaders);
}
}

Expand All @@ -171,7 +178,7 @@ public void loadBookmarkpage() {
File bookmarkWebPage = new File(mActivity.getFilesDir(), BookmarkPage.FILENAME);

BrowserApp.getAppComponent().getBookmarkPage().buildBookmarkPage(null);
mWebView.loadUrl(Constants.FILE + bookmarkWebPage);
mWebView.loadUrl(Constants.FILE + bookmarkWebPage, mRequestHeaders);

}

Expand All @@ -182,14 +189,25 @@ public void loadBookmarkpage() {
* if you don't have a reference to them
* @param context the context in which the WebView was created
*/
@SuppressLint("NewApi")
@SuppressLint({"NewApi", "SetJavaScriptEnabled"})
public synchronized void initializePreferences(@Nullable WebSettings settings, Context context) {
if (settings == null && mWebView == null) {
return;
} else if (settings == null) {
settings = mWebView.getSettings();
}

if (mPreferences.getDoNotTrackEnabled()) {
mRequestHeaders.put(HEADER_DNT, "1");
} else {
mRequestHeaders.remove(HEADER_DNT);
}

if (mPreferences.getRemoveIdentifyingHeadersEnabled()) {
mRequestHeaders.put(HEADER_REQUESTED_WITH, "");
mRequestHeaders.put(HEADER_WAP_PROFILE, "");
}

settings.setDefaultTextEncodingName(mPreferences.getTextEncoding());
mHomepage = mPreferences.getHomepage();
setColorMode(mPreferences.getRenderingMode());
Expand Down Expand Up @@ -384,6 +402,11 @@ private void setUserAgent(Context context, int choice) {
}
}

@NonNull
protected Map<String, String> getRequestHeaders() {
return mRequestHeaders;
}

public boolean isShown() {
return mWebView != null && mWebView.isShown();
}
Expand Down Expand Up @@ -679,7 +702,7 @@ public synchronized void loadUrl(String url) {
}

if (mWebView != null) {
mWebView.loadUrl(url);
mWebView.loadUrl(url, mRequestHeaders);
}
}

Expand Down Expand Up @@ -784,7 +807,7 @@ public void onShowPress(MotionEvent e) {

private static class WebViewHandler extends Handler {

private WeakReference<LightningView> mReference;
private final WeakReference<LightningView> mReference;

public WebViewHandler(LightningView view) {
mReference = new WeakReference<>(view);
Expand Down
Expand Up @@ -30,6 +30,7 @@
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import acr.browser.lightning.R;
import acr.browser.lightning.app.BrowserApp;
Expand All @@ -41,12 +42,9 @@
import acr.browser.lightning.utils.ProxyUtils;
import acr.browser.lightning.utils.Utils;

/**
* @author Stefano Pacifici based on Anthony C. Restaino's code
* @date 2015/09/22
*/
class LightningWebClient extends WebViewClient {


private final Activity mActivity;
private final LightningView mLightningView;
private final UIController mUIController;
Expand Down Expand Up @@ -152,7 +150,6 @@ public void onClick(DialogInterface dialog, int id) {
@Override
public void onClick(DialogInterface dialog, int id) {
handler.cancel();

}
});
AlertDialog alert = builder.create();
Expand Down Expand Up @@ -275,13 +272,17 @@ public boolean shouldOverrideUrlLoading(WebView view, String url) {
return true;
}

Map<String, String> headers = mLightningView.getRequestHeaders();

if (mLightningView.mIsIncognitoTab) {
return super.shouldOverrideUrlLoading(view, url);
view.loadUrl(url, headers);
return true;
}
if (url.startsWith("about:")) {
return super.shouldOverrideUrlLoading(view, url);
view.loadUrl(url, headers);
return true;
}
if (url.contains("mailto:")) {
if (url.startsWith("mailto:")) {
MailTo mailTo = MailTo.parse(url);
Intent i = Utils.newEmailIntent(mailTo.getTo(), mailTo.getSubject(),
mailTo.getBody(), mailTo.getCc());
Expand All @@ -292,8 +293,8 @@ public boolean shouldOverrideUrlLoading(WebView view, String url) {
Intent intent;
try {
intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME);
} catch (URISyntaxException ex) {
return false;
} catch (URISyntaxException ignored) {
intent = null;
}
if (intent != null) {
intent.addCategory(Intent.CATEGORY_BROWSABLE);
Expand All @@ -309,6 +310,10 @@ public boolean shouldOverrideUrlLoading(WebView view, String url) {
return true;
}
}
return mIntentUtils.startActivityForUrl(view, url);

if (!mIntentUtils.startActivityForUrl(view, url)) {
view.loadUrl(url, headers);
}
return true;
}
}
2 changes: 2 additions & 0 deletions app/src/main/res/values/strings.xml
Expand Up @@ -224,4 +224,6 @@
<string name="hosts_source">Hosts File Ad Blocking Source</string>
<string name="settings_adblock">Ad Block Settings</string>
<string name="tabs_in_drawer">Show tabs in Navigation Drawer</string>
<string name="do_not_track">Request \'Do Not Track\'</string>
<string name="remove_identifying_headers">Remove Identifying Headers</string>
</resources>

0 comments on commit 7a0c79d

Please sign in to comment.