Make basic progress with the `X-Requested-With` header.
authorSoren Stoutner <soren@stoutner.com>
Sat, 20 Aug 2016 05:42:15 +0000 (22:42 -0700)
committerSoren Stoutner <soren@stoutner.com>
Sat, 20 Aug 2016 05:42:15 +0000 (22:42 -0700)
app/src/main/assets/de/about_contributors.html
app/src/main/assets/de/about_licenses.html
app/src/main/assets/en/guide_user_agent.html
app/src/main/java/com/stoutner/privacybrowser/BookmarksActivity.java
app/src/main/java/com/stoutner/privacybrowser/MainWebViewActivity.java
app/src/main/res/values-de/strings.xml

index 7aebef01512ec69817c1070154dabdd57c0a257f..ba61ab18346aa178d1382a41a577b58b94223d9d 100644 (file)
@@ -38,6 +38,8 @@
 
 <h3>Mitwirkende</h3>
 
+<a href="mailto:aaron@gerlach.com">Aaron Gerlach</a>: Deutsche Übersetzung
+
 <p>Mitwirkung ist willkommen in Form von <a href="https://www.stoutner.com/privacy-browser/contributors/">Code und Übersetzung</a>.</p>
 </body>
 </html>
\ No newline at end of file
index 1a7f03c90d09e32638562db9ba5265b2c5fba670..1be868b5ff32e8ebe1849e7286d7c45229f8c974 100644 (file)
 <hr/>
 
 <h3>GNU General Public License</h3>
+<p><a href="http://www.gnu.de/documents/gpl.de.html">Offizielle deutsche Übersetzung der GNU General Public License</a></p>
+
+<p></p>
+
 <p>Version 3, 29 June 2007</p>
 
 <p>Copyright &copy; 2007 Free Software Foundation, Inc.
index 6a0983fdc819976f58f0ee0fc6bf860798303cdc..6c33ee4a31910644be456503dcedd8db36b6ed7d 100644 (file)
 
 <img class="center" src="images/user_agent.png" height="640" width="360">
 
-<p>There is enough information in the user agent that sometimes only a few visitors to a website will be the same.  If the user agent
+<p>There is enough information in the user agent that sometimes only a few visitors to a website will be the same. If the user agent
     is combined with another piece of non-unique identifying information, often it results in a unique fingerprint.
     The Electronic Frontier Foundation created a tool called <a href="https://panopticlick.eff.org/">Panopticlick</a>
     to demonstrate how much information can be gleaned from these sources. If this test is run with JavaScript enabled the
-    amount of information that is disclosed increases greatly. <a href="https://amiunique.org/">amiunique.org</a> and
-    <a href="https://ip-check.info">IP Check</a> are also good sources of information.</p>
+    amount of information that is disclosed increases greatly. <a href="https://www.browserleaks.com">Browser Leaks</a> and
+    <a href="https://amiunique.org/">Am I Unique</a> are also good sources of information.</p>
 
 <img class="center" src="images/panopticlick.png" height=640" width="360">
 
index 834889cbb8fa22743cd3d137b7b071e0a6a16a28..0c1a883fd9f398cf7aa8d5aff61e35a1d8470139 100644 (file)
@@ -135,7 +135,7 @@ public class BookmarksActivity extends AppCompatActivity implements CreateBookma
                     MainWebViewActivity.formattedUrlString = bookmarkCursor.getString(bookmarkCursor.getColumnIndex(BookmarksDatabaseHandler.BOOKMARK_URL));
 
                     //  Load formattedUrlString and return to the main activity.
-                    MainWebViewActivity.mainWebView.loadUrl(MainWebViewActivity.formattedUrlString);
+                    MainWebViewActivity.mainWebView.loadUrl(MainWebViewActivity.formattedUrlString, MainWebViewActivity.customHeaders);
                     NavUtils.navigateUpFromSameTask(bookmarksActivity);
                 }
 
index ca0cc89c5409fe5d0b81997598c8f3ba48813560..f27f961580a772867b7cbb0f1fe750cc52ee23b6 100644 (file)
@@ -65,6 +65,8 @@ import java.io.UnsupportedEncodingException;
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.net.URLEncoder;
+import java.util.HashMap;
+import java.util.Map;
 
 // We need to use AppCompatActivity from android.support.v7.app.AppCompatActivity to have access to the SupportActionBar until the minimum API is >= 21.
 public class MainWebViewActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener, CreateHomeScreenShortcut.CreateHomeScreenSchortcutListener {
@@ -72,67 +74,70 @@ public class MainWebViewActivity extends AppCompatActivity implements Navigation
     // It is also used in `onCreate()` and `onCreateHomeScreenShortcutCreate()`.
     public static Bitmap favoriteIcon;
 
-    // mainWebView is public static so it can be accessed from SettingsFragment.
-    // It is also used in onCreate(), onOptionsItemSelected(), onNavigationItemSelected(), and loadUrlFromTextBox().
+    // `mainWebView` is public static so it can be accessed from `SettingsFragment`.
+    // It is also used in `onCreate()`, `onOptionsItemSelected()`, `onNavigationItemSelected()`, and `loadUrlFromTextBox()`.
     public static WebView mainWebView;
 
-    // formattedUrlString is public static so it can be accessed from BookmarksActivity.
-    // It is also used in onCreate(), onOptionsItemSelected(), onCreateHomeScreenShortcutCreate(), and loadUrlFromTextBox().
+    // `formattedUrlString` is public static so it can be accessed from `BookmarksActivity`.
+    // It is also used in `onCreate()`, `onOptionsItemSelected()`, `onCreateHomeScreenShortcutCreate()`, and `loadUrlFromTextBox()`.
     public static String formattedUrlString;
 
-    // mainMenu is public static so it can be accessed from SettingsFragment.  It is also used in onCreateOptionsMenu() and onOptionsItemSelected().
+    // `mainMenu` is public static so it can be accessed from `SettingsFragment`.  It is also used in `onCreateOptionsMenu()` and `onOptionsItemSelected()`.
     public static Menu mainMenu;
 
-    // cookieManager is public static so it can be accessed from SettingsFragment.  It is also used in onCreate(), onOptionsItemSelected(), and onNavigationItemSelected().
+    // `cookieManager` is public static so it can be accessed from `SettingsFragment`.  It is also used in `onCreate()`, `onOptionsItemSelected()`, and `onNavigationItemSelected()`.
     public static CookieManager cookieManager;
 
-    // javaScriptEnabled is public static so it can be accessed from SettingsFragment.
-    // It is also used in onCreate(), onCreateOptionsMenu(), onOptionsItemSelected(), and loadUrlFromTextBox().
+    // `javaScriptEnabled` is public static so it can be accessed from `SettingsFragment`.
+    // It is also used in `onCreate()`, `onCreateOptionsMenu()`, `onOptionsItemSelected()`, and `loadUrlFromTextBox()`.
     public static boolean javaScriptEnabled;
 
-    // firstPartyCookiesEnabled is public static so it can be accessed from SettingsFragment.
-    // It is also used in onCreate(), onCreateOptionsMenu(), onPrepareOptionsMenu(), and onOptionsItemSelected().
+    // `firstPartyCookiesEnabled` is public static so it can be accessed from `SettingsFragment`.
+    // It is also used in `onCreate()`, `onCreateOptionsMenu()`, `onPrepareOptionsMenu()`, and `onOptionsItemSelected()`.
     public static boolean firstPartyCookiesEnabled;
 
-    // thirdPartyCookiesEnabled is used in onCreate(), onCreateOptionsMenu(), onPrepareOptionsMenu(), and onOptionsItemSelected().
+    // `thirdPartyCookiesEnabled` is used in `onCreate()`, `onCreateOptionsMenu()`, `onPrepareOptionsMenu()`, and `onOptionsItemSelected()`.
     public static boolean thirdPartyCookiesEnabled;
 
-    // domStorageEnabled is public static so it can be accessed from SettingsFragment.  It is also used in onCreate(), onCreateOptionsMenu(), and onOptionsItemSelected().
+    // `domStorageEnabled` is public static so it can be accessed from `SettingsFragment`.  It is also used in `onCreate()`, `onCreateOptionsMenu()`, and `onOptionsItemSelected()`.
     public static boolean domStorageEnabled;
 
-    // saveFormDataEnabled is public static so it can be accessed from SettingsFragment.  It is also used in onCreate(), onCreateOptionsMenu(), and onOptionsItemSelected().
+    // `saveFormDataEnabled` is public static so it can be accessed from `SettingsFragment`.  It is also used in `onCreate()`, `onCreateOptionsMenu()`, and `onOptionsItemSelected()`.
     public static boolean saveFormDataEnabled;
 
-    // javaScriptDisabledSearchURL is public static so it can be accessed from SettingsFragment.  It is also used in onCreate() and loadURLFromTextBox().
+    // `javaScriptDisabledSearchURL` is public static so it can be accessed from `SettingsFragment`.  It is also used in `onCreate()` and `loadURLFromTextBox()`.
     public static String javaScriptDisabledSearchURL;
 
-    // javaScriptEnabledSearchURL is public static so it can be accessed from SettingsFragment.  It is also used in onCreate() and loadURLFromTextBox().
+    // `javaScriptEnabledSearchURL` is public static so it can be accessed from `SettingsFragment`.  It is also used in `onCreate()` and `loadURLFromTextBox()`.
     public static String javaScriptEnabledSearchURL;
 
-    // homepage is public static so it can be accessed from  SettingsFragment.  It is also used in onCreate() and onOptionsItemSelected().
+    // `homepage` is public static so it can be accessed from `SettingsFragment`.  It is also used in `onCreate()` and `onOptionsItemSelected()`.
     public static String homepage;
 
-    // swipeToRefresh is public static so it can be accessed from SettingsFragment.  It is also used in onCreate().
+    // `swipeToRefresh` is public static so it can be accessed from SettingsFragment.  It is also used in onCreate().
     public static SwipeRefreshLayout swipeToRefresh;
 
-    // swipeToRefreshEnabled is public static so it can be accessed from SettingsFragment.  It is also used in onCreate().
+    // `swipeToRefreshEnabled` is public static so it can be accessed from `SettingsFragment`.  It is also used in `onCreate()`.
     public static boolean swipeToRefreshEnabled;
 
+    // `customHeader` is public static so it can be accessed from `BookmarksActivity`.  It is also used in `onCreate()` and `loadUrlFromTextBox()`.
+    public static Map<String, String> customHeaders = new HashMap<String, String>();
 
 
-    // drawerToggle is used in onCreate(), onPostCreate(), onConfigurationChanged(), onNewIntent(), and onNavigationItemSelected().
+
+    // `drawerToggle` is used in `onCreate()`, `onPostCreate()`, `onConfigurationChanged()`, `onNewIntent()`, and `onNavigationItemSelected()`.
     private ActionBarDrawerToggle drawerToggle;
 
-    // drawerLayout is used in onCreate(), onNewIntent(), and onBackPressed().
+    // `drawerLayout` is used in `onCreate()`, `onNewIntent()`, and `onBackPressed()`.
     private DrawerLayout drawerLayout;
 
-    // privacyIcon is used in onCreateOptionsMenu() and updatePrivacyIcon().
+    // `privacyIcon` is used in `onCreateOptionsMenu()` and `updatePrivacyIcon()`.
     private MenuItem privacyIcon;
 
-    // urlTextBox is used in onCreate(), onOptionsItemSelected(), and loadUrlFromTextBox().
+    // `urlTextBox` is used in `onCreate()`, `onOptionsItemSelected()`, and `loadUrlFromTextBox()`.
     private EditText urlTextBox;
 
-    // adView is used in onCreate() and onConfigurationChanged().
+    // `adView` is used in `onCreate()` and `onConfigurationChanged()`.
     private View adView;
 
     @Override
@@ -203,6 +208,9 @@ public class MainWebViewActivity extends AppCompatActivity implements Navigation
         // drawerToggle creates the hamburger icon at the start of the AppBar.
         drawerToggle = new ActionBarDrawerToggle(this, drawerLayout, supportAppBar, R.string.open_navigation, R.string.close_navigation);
 
+        // Replace the header that `WebView` creates for `X-Requested-With` with a null value.  The default value is the application ID (com.stoutner.privacybrowser.standard).
+        customHeaders.put("X-Requested-With", "");
+
         mainWebView.setWebViewClient(new WebViewClient() {
             // shouldOverrideUrlLoading makes this `WebView` the default handler for URLs inside the app, so that links are not kicked out to other apps.
             @Override
@@ -222,7 +230,7 @@ public class MainWebViewActivity extends AppCompatActivity implements Navigation
                     startActivity(emailIntent);
                     return true;
                 } else {  // Load the URL in Privacy Browser.
-                    mainWebView.loadUrl(url);
+                    mainWebView.loadUrl(url, customHeaders);
                     return true;
                 }
             }
@@ -430,9 +438,9 @@ public class MainWebViewActivity extends AppCompatActivity implements Navigation
         }
 
         // Load the initial website.
-        mainWebView.loadUrl(formattedUrlString);
+        mainWebView.loadUrl(formattedUrlString, customHeaders);
 
-        // Load the default favorite icon if it is null.
+        // If the favorite icon is null, load the default.
         if (favoriteIcon == null) {
             // We have to use `ContextCompat` until API >= 21.
             Drawable favoriteIconDrawable = ContextCompat.getDrawable(getApplicationContext(), R.drawable.world);
@@ -448,7 +456,7 @@ public class MainWebViewActivity extends AppCompatActivity implements Navigation
 
     @Override
     protected void onNewIntent(Intent intent) {
-        // Sets the new intent as the activity intent, so that any future getIntent()s pick up this one instead of creating a new activity.
+        // Sets the new intent as the activity intent, so that any future `getIntent()`s pick up this one instead of creating a new activity.
         setIntent(intent);
 
         if (intent.getData() != null) {
@@ -463,7 +471,7 @@ public class MainWebViewActivity extends AppCompatActivity implements Navigation
         }
 
         // Load the website.
-        mainWebView.loadUrl(formattedUrlString);
+        mainWebView.loadUrl(formattedUrlString, customHeaders);
 
         // Clear the keyboard if displayed and remove the focus on the urlTextBar if it has it.
         mainWebView.requestFocus();
@@ -679,7 +687,7 @@ public class MainWebViewActivity extends AppCompatActivity implements Navigation
 
         switch (menuItemId) {
             case R.id.home:
-                mainWebView.loadUrl(homepage);
+                mainWebView.loadUrl(homepage, customHeaders);
                 break;
 
             case R.id.back:
@@ -893,7 +901,7 @@ public class MainWebViewActivity extends AppCompatActivity implements Navigation
             }
         }
 
-        mainWebView.loadUrl(formattedUrlString);
+        mainWebView.loadUrl(formattedUrlString, customHeaders);
 
         // Hides the keyboard so we can see the webpage.
         InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE);
index 945ebade43b90bed97152f5631314f5b234724ee..c090615d690843b38c5acf3148d70c08cbc54951 100644 (file)
@@ -49,7 +49,7 @@
     <string name="home">Startseite</string>
     <string name="back">Zurück</string>
     <string name="forward">Vorwärts</string>
-    <string name="bookmarks">lesezeichen</string>
+    <string name="bookmarks">Lesezeichen</string>
     <string name="downloads">Downloads</string>
     <string name="settings">Einstellungen</string>
     <string name="guide">Handbuch</string>
     <!-- About Activity. -->
     <string name="about_privacy_browser">Über Privacy Browser</string>
     <string name="version">Version</string>
-    <string name="version_code">Versions-Code</string>
-    <string name="hardware">Hardware</string>
-    <!-- Blank spaces at the end of strings are stripped out, so you have to replace them with the Unicode literal \u00A0. -->
-    <string name="brand">Marke:\u00A0</string>
-    <string name="manufacturer">Hersteller:\u00A0</string>
-    <string name="model">Modell:\u00A0</string>
-    <string name="device">Gerät:\u00A0</string>
-    <string name="bootloader">Bootloader:\u00A0</string>
-    <string name="radio">Radio:\u00A0</string>
-    <string name="software">Software</string>
-    <string name="android">Android:\u00A0</string>
-    <string name="api">API</string>
-    <string name="build">Build:\u00A0</string>
-    <string name="security_patch">Sicherheits-Patch:\u00A0</string>
-    <string name="webkit">WebKit:\u00A0</string>
-    <string name="chrome">Chrome:\u00A0</string>
+        <string name="version_code">Versions-Code</string>
+        <string name="hardware">Hardware</string>
+            <!-- Blank spaces at the end of strings are stripped out, so you have to replace them with the Unicode literal \u00A0. -->
+            <string name="brand">Marke:\u00A0</string>
+            <string name="manufacturer">Hersteller:\u00A0</string>
+            <string name="model">Modell:\u00A0</string>
+            <string name="device">Gerät:\u00A0</string>
+            <string name="bootloader">Bootloader:\u00A0</string>
+            <string name="radio">Radio:\u00A0</string>
+        <string name="software">Software</string>
+            <string name="android">Android:\u00A0</string>
+            <string name="api">API</string>
+            <string name="build">Build:\u00A0</string>
+            <string name="security_patch">Sicherheits-Patch:\u00A0</string>
+            <string name="webkit">WebKit:\u00A0</string>
+            <string name="chrome">Chrome:\u00A0</string>
     <string name="permissions">Berechtigungen</string>
     <string name="privacy_policy">Datenschutzrichtlinie</string>
     <string name="changelog">Changelog</string>