Fix incorrect pinned mismatch errors. https://redmine.stoutner.com/issues/591 master
authorSoren Stoutner <soren@stoutner.com>
Tue, 13 Oct 2020 04:12:41 +0000 (21:12 -0700)
committerSoren Stoutner <soren@stoutner.com>
Tue, 13 Oct 2020 04:12:41 +0000 (21:12 -0700)
app/src/main/java/com/stoutner/privacybrowser/activities/MainWebViewActivity.java
app/src/main/java/com/stoutner/privacybrowser/asynctasks/GetHostIpAddresses.java
app/src/main/java/com/stoutner/privacybrowser/views/NestedScrollWebView.java

index 9107d5af73da0b4bbc3b01badde3ea66e963a0fb..9f51f749dcbb26993e1eb87fcb1b4cd3b383cc24 100644 (file)
@@ -148,7 +148,6 @@ import com.stoutner.privacybrowser.fragments.WebViewTabFragment;
 import com.stoutner.privacybrowser.helpers.AdHelper;
 import com.stoutner.privacybrowser.helpers.BlocklistHelper;
 import com.stoutner.privacybrowser.helpers.BookmarksDatabaseHelper;
-import com.stoutner.privacybrowser.helpers.CheckPinnedMismatchHelper;
 import com.stoutner.privacybrowser.helpers.DomainsDatabaseHelper;
 import com.stoutner.privacybrowser.helpers.FileNameHelper;
 import com.stoutner.privacybrowser.helpers.ProxyHelper;
@@ -546,7 +545,7 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook
 
                     // Reapply the domain settings if the URL is not null, which can happen if an empty tab is active when returning from settings.
                     if (nestedScrollWebView.getUrl() != null) {
-                        applyDomainSettings(nestedScrollWebView, nestedScrollWebView.getUrl(), false, true);
+                        applyDomainSettings(nestedScrollWebView, nestedScrollWebView.getUrl(), false, true, false);
                     }
                 }
             }
@@ -1942,7 +1941,7 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook
                     String previousUrl = webBackForwardList.getItemAtIndex(webBackForwardList.getCurrentIndex() - 1).getUrl();
 
                     // Apply the domain settings.
-                    applyDomainSettings(currentWebView, previousUrl, false, false);
+                    applyDomainSettings(currentWebView, previousUrl, false, false, false);
 
                     // Load the previous website in the history.
                     currentWebView.goBack();
@@ -1958,7 +1957,7 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook
                     String nextUrl = webBackForwardList.getItemAtIndex(webBackForwardList.getCurrentIndex() + 1).getUrl();
 
                     // Apply the domain settings.
-                    applyDomainSettings(currentWebView, nextUrl, false, false);
+                    applyDomainSettings(currentWebView, nextUrl, false, false, false);
 
                     // Load the next website in the history.
                     currentWebView.goForward();
@@ -2720,7 +2719,7 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook
             String previousUrl = webBackForwardList.getItemAtIndex(webBackForwardList.getCurrentIndex() - 1).getUrl();
 
             // Apply the domain settings.
-            applyDomainSettings(currentWebView, previousUrl, false, false);
+            applyDomainSettings(currentWebView, previousUrl, false, false, false);
 
             // Go back.
             currentWebView.goBack();
@@ -2906,11 +2905,8 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook
         // Sanitize the URL.
         url = sanitizeUrl(url);
 
-        // Apply the domain settings.
-        applyDomainSettings(nestedScrollWebView, url, true, false);
-
-        // Load the URL.
-        nestedScrollWebView.loadUrl(url, customHeaders);
+        // Apply the domain settings and load the URL.
+        applyDomainSettings(nestedScrollWebView, url, true, false, true);
     }
 
     public void findPreviousOnPage(View view) {
@@ -2993,7 +2989,7 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook
         openFilePath = fileNameEditText.getText().toString();
 
         // Apply the domain settings.  This resets the favorite icon and removes any domain settings.
-        applyDomainSettings(currentWebView, "file://" + openFilePath, true, false);
+        applyDomainSettings(currentWebView, "file://" + openFilePath, true, false, false);
 
         // Check to see if the storage permission is needed.
         if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {  // The storage permission has been granted.
@@ -3769,7 +3765,7 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook
     @Override
     public void navigateHistory(String url, int steps) {
         // Apply the domain settings.
-        applyDomainSettings(currentWebView, url, false, false);
+        applyDomainSettings(currentWebView, url, false, false, false);
 
         // Load the history entry.
         currentWebView.goBackOrForward(steps);
@@ -3784,7 +3780,7 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook
         String previousUrl = webBackForwardList.getItemAtIndex(webBackForwardList.getCurrentIndex() - 1).getUrl();
 
         // Apply the domain settings.
-        applyDomainSettings(currentWebView, previousUrl, false, false);
+        applyDomainSettings(currentWebView, previousUrl, false, false, false);
 
         // Go back.
         currentWebView.goBack();
@@ -3792,7 +3788,7 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook
 
     // `reloadWebsite` is used if returning from the Domains activity.  Otherwise JavaScript might not function correctly if it is newly enabled.
     @SuppressLint("SetJavaScriptEnabled")
-    private void applyDomainSettings(NestedScrollWebView nestedScrollWebView, String url, boolean resetTab, boolean reloadWebsite) {
+    private void applyDomainSettings(NestedScrollWebView nestedScrollWebView, String url, boolean resetTab, boolean reloadWebsite, boolean loadUrl) {
         // Store the current URL.
         nestedScrollWebView.setCurrentUrl(url);
 
@@ -4311,6 +4307,11 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook
         if (reloadWebsite) {
             nestedScrollWebView.reload();
         }
+
+        // Load the URL if directed.  This makes sure that the domain settings are properly loaded before the URL.  By using `loadUrl()`, instead of `loadUrlFromBase()`, the Referer header will never be sent.
+        if (loadUrl) {
+            nestedScrollWebView.loadUrl(url, customHeaders);
+        }
     }
 
     private void applyProxy(boolean reloadWebViews) {
@@ -5737,11 +5738,8 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook
 
                 // Handle the URL according to the type.
                 if (url.startsWith("http")) {  // Load the URL in Privacy Browser.
-                    // Apply the domain settings for the new URL.  This doesn't do anything if the domain has not changed.
-                    applyDomainSettings(nestedScrollWebView, url, true, false);
-
                     // Load the URL.  By using `loadUrl()`, instead of `loadUrlFromBase()`, the Referer header will never be sent.
-                    nestedScrollWebView.loadUrl(url, customHeaders);
+                    loadUrl(nestedScrollWebView, url);
 
                     // Returning true indicates that Privacy Browser is manually handling the loading of the URL.
                     // Custom headers cannot be added if false is returned and the WebView handles the loading of the URL.
@@ -6331,12 +6329,6 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook
                 // Get the current page position.
                 int currentPagePosition = webViewPagerAdapter.getPositionForId(nestedScrollWebView.getWebViewFragmentId());
 
-                // Check the current website information against any pinned domain information if the current IP addresses have been loaded.
-                if ((nestedScrollWebView.hasPinnedSslCertificate() || nestedScrollWebView.hasPinnedIpAddresses()) && nestedScrollWebView.hasCurrentIpAddresses() &&
-                        !nestedScrollWebView.ignorePinnedDomainInformation()) {
-                    CheckPinnedMismatchHelper.checkPinnedMismatch(getSupportFragmentManager(), nestedScrollWebView);
-                }
-
                 // Get the current URL from the nested scroll WebView.  This is more accurate than using the URL passed into the method, which is sometimes not the final one.
                 String currentUrl = nestedScrollWebView.getUrl();
 
@@ -6359,7 +6351,7 @@ public class MainWebViewActivity extends AppCompatActivity implements CreateBook
                         inputMethodManager.showSoftInput(urlEditText, 0);
 
                         // Apply the domain settings.  This clears any settings from the previous domain.
-                        applyDomainSettings(nestedScrollWebView, "", true, false);
+                        applyDomainSettings(nestedScrollWebView, "", true, false, false);
 
                         // Only populate the title text view if the tab has been fully created.
                         if (tab != null) {
index 050ae1dd502437c302383e2b86c5079c6419751a..811eb7d322192a445a55c1ca5d3b08f98972bd45 100644 (file)
@@ -68,16 +68,13 @@ public class GetHostIpAddresses extends AsyncTask<String, Void, String> {
 
             // Add each IP address to the string builder.
             for (InetAddress inetAddress : inetAddressesArray) {
-                if (ipAddresses.length() == 0) {  // This is the first IP address.
-                    // Add the IP address to the string builder.
-                    ipAddresses.append(inetAddress.getHostAddress());
-                } else {  // This is not the first IP address.
-                    // Add a line break to the string builder first.
+                // Add a line break to the string builder if this is not the first IP address.
+                if (ipAddresses.length() > 0) {
                     ipAddresses.append("\n");
-
-                    // Add the IP address to the string builder.
-                    ipAddresses.append(inetAddress.getHostAddress());
                 }
+
+                // Add the IP address to the string builder.
+                ipAddresses.append(inetAddress.getHostAddress());
             }
         } catch (UnknownHostException exception) {
             // Do nothing.
@@ -103,8 +100,8 @@ public class GetHostIpAddresses extends AsyncTask<String, Void, String> {
         // Store the IP addresses.
         nestedScrollWebView.setCurrentIpAddresses(ipAddresses);
 
-        // Checked for pinned mismatches if the WebView is not loading a URL, pinned information is not ignored, and there is pinned information.
-        if ((nestedScrollWebView.getProgress() == 100) && !nestedScrollWebView.ignorePinnedDomainInformation() && (nestedScrollWebView.hasPinnedSslCertificate() || nestedScrollWebView.hasPinnedIpAddresses())) {
+        // Checked for pinned mismatches if there is pinned information and it is not ignored.
+        if ((nestedScrollWebView.hasPinnedSslCertificate() || nestedScrollWebView.hasPinnedIpAddresses()) && !nestedScrollWebView.ignorePinnedDomainInformation()) {
             CheckPinnedMismatchHelper.checkPinnedMismatch(fragmentManager, nestedScrollWebView);
         }
     }
index 1ae819c27eace329e4c0b8a7eec111a9a3429d36..4d97670d87210da1139873701353d858f480e401 100644 (file)
@@ -614,8 +614,6 @@ public class NestedScrollWebView extends WebView implements NestedScrollingChild
         ignorePinnedDomainInformation = status;
     }
 
-    // The syntax looks better as written, even if it is always inverted.
-    @SuppressWarnings("BooleanMethodIsAlwaysInverted")
     public boolean ignorePinnedDomainInformation() {
         // Return the status of the ignore pinned domain information tracker.
         return ignorePinnedDomainInformation;