Verified Commit 9722ca26 authored by Pier Angelo Vendrame's avatar Pier Angelo Vendrame 🎃
Browse files

fixup! Bug 10760: Integrate TorButton to TorBrowser core

Removed torbutton.js, tor-control-port.js and utils.js.
parent 57b25177
Loading
Loading
Loading
Loading
+0 −6
Original line number Diff line number Diff line
@@ -130,17 +130,11 @@
  Services.scriptloader.loadSubScript("chrome://browser/content/search/autocomplete-popup.js", this);
  Services.scriptloader.loadSubScript("chrome://browser/content/search/searchbar.js", this);
  Services.scriptloader.loadSubScript("chrome://browser/content/languageNotification.js", this);
  Services.scriptloader.loadSubScript("chrome://torbutton/content/torbutton.js", this);

  window.onload = gBrowserInit.onLoad.bind(gBrowserInit);
  window.onunload = gBrowserInit.onUnload.bind(gBrowserInit);
  window.onclose = WindowIsClosing;

  //onLoad Handler
  try {
    window.addEventListener("load", torbutton_init);
  } catch (e) {}

  window.addEventListener("MozBeforeInitialXULLayout",
    gBrowserInit.onBeforeInitialXULLayout.bind(gBrowserInit), { once: true });

+0 −148
Original line number Diff line number Diff line
// window globals
var torbutton_init;

(() => {
  // Bug 1506 P1-P5: This is the main Torbutton overlay file. Much needs to be
  // preserved here, but in an ideal world, most of this code should perhaps be
  // moved into an XPCOM service, and much can also be tossed. See also
  // individual 1506 comments for details.

  // TODO: check for leaks: http://www.mozilla.org/scriptable/avoiding-leaks.html
  // TODO: Double-check there are no strange exploits to defeat:
  //       http://kb.mozillazine.org/Links_to_local_pages_don%27t_work

  /* global gBrowser, Services, AppConstants */

  let { torbutton_log } = ChromeUtils.import(
    "resource://torbutton/modules/utils.js"
  );
  let { configureControlPortModule } = ChromeUtils.import(
    "resource://torbutton/modules/tor-control-port.js"
  );

  const { TorProtocolService } = ChromeUtils.import(
    "resource://gre/modules/TorProtocolService.jsm"
  );

  var m_tb_prefs = Services.prefs;

  // status
  var m_tb_wasinited = false;

  var m_tb_control_ipc_file = null; // Set if using IPC (UNIX domain socket).
  var m_tb_control_port = null; // Set if using TCP.
  var m_tb_control_host = null; // Set if using TCP.
  var m_tb_control_pass = null;

  // Bug 1506 P2-P4: This code sets some version variables that are irrelevant.
  // It does read out some important environment variables, though. It is
  // called once per browser window.. This might belong in a component.
  torbutton_init = function () {
    torbutton_log(3, "called init()");

    if (m_tb_wasinited) {
      return;
    }
    m_tb_wasinited = true;

    // Bug 1506 P4: These vars are very important for New Identity
    if (Services.env.exists("TOR_CONTROL_PASSWD")) {
      m_tb_control_pass = Services.env.get("TOR_CONTROL_PASSWD");
    } else if (Services.env.exists("TOR_CONTROL_COOKIE_AUTH_FILE")) {
      var cookie_path = Services.env.get("TOR_CONTROL_COOKIE_AUTH_FILE");
      try {
        if ("" != cookie_path) {
          m_tb_control_pass = torbutton_read_authentication_cookie(cookie_path);
        }
      } catch (e) {
        torbutton_log(4, "unable to read authentication cookie");
      }
    } else {
      try {
        // Try to get password from Tor Launcher.
        m_tb_control_pass = TorProtocolService.torGetPassword();
      } catch (e) {}
    }

    // Try to get the control port IPC file (an nsIFile) from Tor Launcher,
    // since Tor Launcher knows how to handle its own preferences and how to
    // resolve relative paths.
    try {
      m_tb_control_ipc_file = TorProtocolService.torGetControlIPCFile();
    } catch (e) {}

    if (!m_tb_control_ipc_file) {
      if (Services.env.exists("TOR_CONTROL_PORT")) {
        m_tb_control_port = Services.env.get("TOR_CONTROL_PORT");
      } else {
        try {
          const kTLControlPortPref = "extensions.torlauncher.control_port";
          m_tb_control_port = m_tb_prefs.getIntPref(kTLControlPortPref);
        } catch (e) {
          // Since we want to disable some features when Tor Launcher is
          // not installed (e.g., New Identity), we do not set a default
          // port value here.
        }
      }

      if (Services.env.exists("TOR_CONTROL_HOST")) {
        m_tb_control_host = Services.env.get("TOR_CONTROL_HOST");
      } else {
        try {
          const kTLControlHostPref = "extensions.torlauncher.control_host";
          m_tb_control_host = m_tb_prefs.getCharPref(kTLControlHostPref);
        } catch (e) {
          m_tb_control_host = "127.0.0.1";
        }
      }
    }

    configureControlPortModule(
      m_tb_control_ipc_file,
      m_tb_control_host,
      m_tb_control_port,
      m_tb_control_pass
    );

    torbutton_log(3, "init completed");
  };

  // Bug 1506 P4: Control port interaction. Needed for New Identity.
  function torbutton_read_authentication_cookie(path) {
    var file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
    file.initWithPath(path);
    var fileStream = Cc[
      "@mozilla.org/network/file-input-stream;1"
    ].createInstance(Ci.nsIFileInputStream);
    fileStream.init(file, 1, 0, false);
    var binaryStream = Cc["@mozilla.org/binaryinputstream;1"].createInstance(
      Ci.nsIBinaryInputStream
    );
    binaryStream.setInputStream(fileStream);
    var array = binaryStream.readByteArray(fileStream.available());
    binaryStream.close();
    fileStream.close();
    return torbutton_array_to_hexdigits(array);
  }

  // Bug 1506 P4: Control port interaction. Needed for New Identity.
  function torbutton_array_to_hexdigits(array) {
    return array
      .map(function (c) {
        return String("0" + c.toString(16)).slice(-2);
      })
      .join("");
  }

  // ---------------------- Event handlers -----------------

  // Bug 1506 P3: This is needed pretty much only for the window resizing.
  // See comments for individual functions for details
  function torbutton_new_window(event) {
    torbutton_log(3, "New window");
    if (!m_tb_wasinited) {
      torbutton_init();
    }
  }
  window.addEventListener("load", torbutton_new_window);
})();

toolkit/torbutton/components.conf

deleted100644 → 0
+0 −10
Original line number Diff line number Diff line
Classes = [
    {
        "cid": "{f36d72c9-9718-4134-b550-e109638331d7}",
        "contract_ids": [
            "@torproject.org/torbutton-logger;1"
        ],
        "jsm": "resource://torbutton/modules/TorbuttonLogger.jsm",
        "constructor": "TorbuttonLogger",
    },
]
+1 −8
Original line number Diff line number Diff line
#filter substitution

torbutton.jar:

% content torbutton %content/

  content/torbutton.js                   (chrome/content/torbutton.js)

  modules/       (modules/*)

% resource torbutton %
% category l10n-registry torbutton resource://torbutton/locale/{locale}/

# browser branding
% override chrome://branding/locale/brand.dtd chrome://torbutton/locale/brand.dtd
% override chrome://branding/locale/brand.properties chrome://torbutton/locale/brand.properties
% category l10n-registry torbutton resource://torbutton/locale/{locale}/

# Strings for the about:tbupdate page
% override chrome://browser/locale/aboutTBUpdate.dtd chrome://torbutton/locale/aboutTBUpdate.dtd
+0 −147
Original line number Diff line number Diff line
// Bug 1506 P1: This is just a handy logger. If you have a better one, toss
// this in the trash.

/*************************************************************************
 * TBLogger (JavaScript XPCOM component)
 *
 * Allows loglevel-based logging to different logging mechanisms.
 *
 *************************************************************************/

var EXPORTED_SYMBOLS = ["TorbuttonLogger"];

const { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");

function TorbuttonLogger() {
  // Register observer
  Services.prefs.addObserver("extensions.torbutton", this);

  this.loglevel = Services.prefs.getIntPref("extensions.torbutton.loglevel", 4);
  this.logmethod = Services.prefs.getIntPref(
    "extensions.torbutton.logmethod",
    1
  );

  try {
    var logMngr = Cc["@mozmonkey.com/debuglogger/manager;1"].getService(
      Ci.nsIDebugLoggerManager
    );
    this._debuglog = logMngr.registerLogger("torbutton");
  } catch (exErr) {
    this._debuglog = false;
  }
  this._console = Services.console;

  // This JSObject is exported directly to chrome
  this.wrappedJSObject = this;
  this.log(3, "Torbutton debug output ready");
}

/**
 * JS XPCOM component registration goop:
 *
 * Everything below is boring boilerplate and can probably be ignored.
 */

TorbuttonLogger.prototype = {
  QueryInterface: ChromeUtils.generateQI([Ci.nsIClassInfo]),

  wrappedJSObject: null, // Initialized by constructor

  formatLog(str, level) {
    const padInt = n => String(n).padStart(2, "0");
    const logString = { 1: "VERB", 2: "DBUG", 3: "INFO", 4: "NOTE", 5: "WARN" };
    const d = new Date();
    const now =
      padInt(d.getUTCMonth() + 1) +
      "-" +
      padInt(d.getUTCDate()) +
      " " +
      padInt(d.getUTCHours()) +
      ":" +
      padInt(d.getUTCMinutes()) +
      ":" +
      padInt(d.getUTCSeconds());
    return `${now} Torbutton ${logString[level]}: ${str}`;
  },

  // error console log
  eclog(level, str) {
    switch (this.logmethod) {
      case 0: // stderr
        if (this.loglevel <= level) {
          dump(this.formatLog(str, level) + "\n");
        }
        break;
      default:
        // errorconsole
        if (this.loglevel <= level) {
          this._console.logStringMessage(this.formatLog(str, level));
        }
        break;
    }
  },

  safe_log(level, str, scrub) {
    if (this.loglevel < 4) {
      this.eclog(level, str + scrub);
    } else {
      this.eclog(level, str + " [scrubbed]");
    }
  },

  log(level, str) {
    switch (this.logmethod) {
      case 2: // debuglogger
        if (this._debuglog) {
          this._debuglog.log(6 - level, this.formatLog(str, level));
          break;
        }
      // fallthrough
      case 0: // stderr
        if (this.loglevel <= level) {
          dump(this.formatLog(str, level) + "\n");
        }
        break;
      case 1: // errorconsole
        if (this.loglevel <= level) {
          this._console.logStringMessage(this.formatLog(str, level));
        }
        break;
      default:
        dump("Bad log method: " + this.logmethod);
    }
  },

  // Pref observer interface implementation

  // topic:   what event occurred
  // subject: what nsIPrefBranch we're observing
  // data:    which pref has been changed (relative to subject)
  observe(subject, topic, data) {
    if (topic != "nsPref:changed") {
      return;
    }
    switch (data) {
      case "extensions.torbutton.logmethod":
        this.logmethod = Services.prefs.getIntPref(
          "extensions.torbutton.logmethod"
        );
        if (this.logmethod === 0) {
          Services.prefs.setBoolPref("browser.dom.window.dump.enabled", true);
        } else if (
          Services.prefs.getIntPref("extensions.torlauncher.logmethod", 3) !== 0
        ) {
          // If Tor Launcher is not available or its log method is not 0
          // then let's reset the dump pref.
          Services.prefs.setBoolPref("browser.dom.window.dump.enabled", false);
        }
        break;
      case "extensions.torbutton.loglevel":
        this.loglevel = Services.prefs.getIntPref(
          "extensions.torbutton.loglevel"
        );
        break;
    }
  },
};
Loading