[tor-commits] [torbutton/master] Bug 4718: Perform version check periodically in the background

mikeperry at torproject.org mikeperry at torproject.org
Thu May 24 01:36:26 UTC 2012


commit 17a284d4444de6bad842809a57322fc3f8cec493
Author: Mike Perry <mikeperry-git at fscked.org>
Date:   Wed May 23 18:15:06 2012 -0700

    Bug 4718: Perform version check periodically in the background
    
    We check every 12 hours.
    
    I also made the update check at startup async as part of this.
---
 src/chrome/content/torbutton.js       |   69 ++++++++++++++++++++++++++++++++-
 src/components/cookie-jar-selector.js |   22 ++++++++++
 2 files changed, 89 insertions(+), 2 deletions(-)

diff --git a/src/chrome/content/torbutton.js b/src/chrome/content/torbutton.js
index 653a777..559a754 100644
--- a/src/chrome/content/torbutton.js
+++ b/src/chrome/content/torbutton.js
@@ -885,6 +885,71 @@ function torbutton_restore_nontor_settings()
   torbutton_log(2, 'settings restored');
 }
 
+function torbutton_do_async_versioncheck() {
+  if (!m_tb_tbb || !m_tb_prefs.getBoolPref("extensions.torbutton.versioncheck_enabled")) {
+    return;
+  }
+  torbutton_log(3, "Checking version");
+  try {
+    var req = Components.classes["@mozilla.org/xmlextras/xmlhttprequest;1"]
+                            .createInstance(Components.interfaces.nsIXMLHttpRequest);
+    //var req = new XMLHttpRequest(); Blocked by content policy
+    var url = m_tb_prefs.getCharPref("extensions.torbutton.versioncheck_url");
+    req.open('GET', url, true);
+    req.channel.loadFlags |= Ci.nsIRequest.LOAD_BYPASS_CACHE;
+    req.overrideMimeType("text/json");
+    req.onreadystatechange = function (oEvent) {  
+      if (req.readyState === 4) {
+        if(req.status == 200) {
+          if(!req.responseText) {
+            torbutton_log(5, "Version check failed! No JSON present!");
+            return -1;
+          }
+          try {
+            var locale = m_tb_prefs.getCharPref("general.useragent.locale");
+            var version_list = JSON.parse(req.responseText);
+            var my_version = m_tb_prefs.getCharPref("torbrowser.version");
+            for (var v in version_list) {
+              if (version_list[v] == my_version) {
+                torbutton_log(3, "Version check passed.");
+                var homepage = m_tb_prefs.getCharPref("browser.startup.homepage");
+                if (homepage.indexOf("https://check.torproject.org/") == 0) {
+                  m_tb_prefs.setCharPref("browser.startup.homepage",
+                      "https://check.torproject.org/?lang="+locale+"&small=1&uptodate=1");
+                }
+                return;
+              }
+            }
+            torbutton_log(5, "Your Tor Browser is out of date.");
+            // Not up to date
+            m_tb_prefs.setCharPref("browser.startup.homepage",
+                "https://check.torproject.org/?lang="+locale+"&small=1&uptodate=0");
+            return;
+          } catch(e) {
+            torbutton_log(5, "Version check failed! JSON parsing error: "+e);
+            return;
+          }
+        } else if (req.status == 404) {
+          // We're going to assume 404 means the service is not implemented yet.
+          torbutton_log(3, "Version check failed. Versions file is 404.");
+          return -1;
+        }
+        torbutton_log(5, "Version check failed! Web server error: "+req.status);
+        return -1;
+      }  
+    };  
+    req.send(null);
+  } catch(e) {
+    if(e.result == 0x80004005) { // NS_ERROR_FAILURE
+      torbutton_log(5, "Version check failed! Is tor running?");
+      return -1;
+    }
+    torbutton_log(5, "Version check failed! Tor internal error: "+e);
+    return -1;
+  }
+
+}
+
 function torbutton_check_version() {
   torbutton_log(3, "Checking version");
   try {
@@ -2967,7 +3032,7 @@ function torbutton_set_launch_state(state, session_restore) {
         torbutton_enable_tor(true);
         torbutton_log(3, "Tor state updated.");
 
-        torbutton_do_versioncheck();
+        torbutton_do_async_versioncheck();
         
         // Load our homepage again. We just killed it via the toggle.
         if (!session_restore) {
@@ -2982,7 +3047,7 @@ function torbutton_set_launch_state(state, session_restore) {
         if(state) torbutton_enable_tor(true);
         else  torbutton_disable_tor();
         
-        torbutton_do_versioncheck();
+        torbutton_do_async_versioncheck();
 
         // Load our homepage again. We just killed it via the toggle.
         if (!session_restore) {
diff --git a/src/components/cookie-jar-selector.js b/src/components/cookie-jar-selector.js
index e26493f..51e4645 100644
--- a/src/components/cookie-jar-selector.js
+++ b/src/components/cookie-jar-selector.js
@@ -494,6 +494,7 @@ function CookieJarSelector() {
   var jarThis = this;
   this.timerCallback = {
     cookie_changed: false,
+    update_counter: 0,
 
     QueryInterface: function(iid) {
        if (!iid.equals(Component.interfaces.nsISupports) &&
@@ -504,6 +505,27 @@ function CookieJarSelector() {
        return this;
     },
     notify: function() {
+       // XXX: ========== WARNING! Ultra-mega hack: ===============
+       // For various reasons, we want to totally refactor Torbutton.
+       // (see #5709). Since there's no great place to place this timer,
+       // I figured we might as well place it here.
+       //
+       // Additionally, mobile should verify that nsITimer.TYPE_REPEATING_SLACK
+       // is smart wrt suspend.
+       //
+       // We want to perform an update check *about* twice per day.
+       // I thought about randomizing it, but the slack will probably
+       // introduce enough noise over the course of 12 hours or so...
+       // Might as well KISS.
+       if (++this.update_counter > 720) {
+           jarThis.logger.log(3, "Performing async version check");
+           this.update_counter = 0;
+           var wm = Cc["@mozilla.org/appshell/window-mediator;1"]
+               .getService(Components.interfaces.nsIWindowMediator);
+           var chrome = wm.getMostRecentWindow("navigator:browser");
+           chrome.torbutton_do_async_versioncheck();
+       }
+
        // this refers to timerCallback object. use jarThis to reference
        // CookieJarSelector object.
        if(!this.cookie_changed) {





More information about the tor-commits mailing list