tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

blockedSite.js (7319B)


      1 /* This Source Code Form is subject to the terms of the Mozilla Public
      2 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
      3 * You can obtain one at http://mozilla.org/MPL/2.0/. */
      4 
      5 // Error url MUST be formatted like this:
      6 //   about:blocked?e=error_code&u=url(&o=1)?
      7 //     (o=1 when user overrides are allowed)
      8 
      9 // Note that this file uses document.documentURI to get
     10 // the URL (with the format from above). This is because
     11 // document.location.href gets the current URI off the docshell,
     12 // which is the URL displayed in the location bar, i.e.
     13 // the URI that the user attempted to load.
     14 
     15 function getErrorCode() {
     16  var url = document.documentURI;
     17  var error = url.search(/e\=/);
     18  var duffUrl = url.search(/\&u\=/);
     19  return decodeURIComponent(url.slice(error + 2, duffUrl));
     20 }
     21 
     22 function getURL() {
     23  var url = document.documentURI;
     24  var match = url.match(/&u=([^&]+)&/);
     25 
     26  // match == null if not found; if so, return an empty string
     27  // instead of what would turn out to be portions of the URI
     28  if (!match) {
     29    return "";
     30  }
     31 
     32  url = decodeURIComponent(match[1]);
     33 
     34  // If this is a view-source page, then get then real URI of the page
     35  if (url.startsWith("view-source:")) {
     36    url = url.slice(12);
     37  }
     38  return url;
     39 }
     40 
     41 function getAddonName() {
     42  var url = document.documentURI;
     43  var match = url.match(/&a=([^&]+)/);
     44 
     45  // match == null if not found; if so, return an empty string
     46  // instead of what would turn out to be portions of the URI
     47  if (!match) {
     48    return "";
     49  }
     50 
     51  return decodeURIComponent(match[1]);
     52 }
     53 
     54 /**
     55 * Check whether this warning page is overridable or not, in which case
     56 * the "ignore the risk" suggestion in the error description
     57 * should not be shown.
     58 */
     59 function getOverride() {
     60  var url = document.documentURI;
     61  var match = url.match(/&o=1&/);
     62  return !!match;
     63 }
     64 
     65 /**
     66 * Attempt to get the hostname via document.location.  Fail back
     67 * to getURL so that we always return something meaningful.
     68 */
     69 function getHostString() {
     70  try {
     71    return document.location.hostname;
     72  } catch (e) {
     73    return getURL();
     74  }
     75 }
     76 
     77 function onClickSeeDetails() {
     78  let details = document.getElementById("errorDescriptionContainer");
     79  details.hidden = !details.hidden;
     80 }
     81 
     82 function initPage() {
     83  const errorMap = {
     84    malwareBlocked: "malware",
     85    deceptiveBlocked: "phishing",
     86    unwantedBlocked: "unwanted",
     87    harmfulBlocked: "harmful",
     88    addonBlocked: "addon",
     89  };
     90  const error = errorMap[getErrorCode()];
     91  if (error === undefined) {
     92    return;
     93  }
     94 
     95  const messageIDs = {
     96    malware: {
     97      title: "safeb-blocked-malware-page-title",
     98      shortDesc: "safeb-blocked-malware-page-short-desc",
     99      innerDescOverride: "safeb-blocked-malware-page-error-desc-override-sumo",
    100      innerDescNoOverride:
    101        "safeb-blocked-malware-page-error-desc-no-override-sumo",
    102      learnMore: "safeb-blocked-malware-page-learn-more-sumo",
    103    },
    104    phishing: {
    105      title: "safeb-blocked-phishing-page-title",
    106      shortDesc: "safeb-blocked-phishing-page-short-desc",
    107      innerDescOverride: "safeb-blocked-phishing-page-error-desc-override",
    108      innerDescNoOverride: "safeb-blocked-phishing-page-error-desc-no-override",
    109      learnMore: "safeb-blocked-phishing-page-learn-more",
    110    },
    111    unwanted: {
    112      title: "safeb-blocked-unwanted-page-title",
    113      shortDesc: "safeb-blocked-unwanted-page-short-desc",
    114      innerDescOverride: "safeb-blocked-unwanted-page-error-desc-override",
    115      innerDescNoOverride: "safeb-blocked-unwanted-page-error-desc-no-override",
    116      learnMore: "safeb-blocked-unwanted-page-learn-more",
    117    },
    118    harmful: {
    119      title: "safeb-blocked-harmful-page-title",
    120      shortDesc: "safeb-blocked-harmful-page-short-desc",
    121      innerDescOverride: "safeb-blocked-harmful-page-error-desc-override",
    122      innerDescNoOverride: "safeb-blocked-harmful-page-error-desc-no-override",
    123      learnMore: "safeb-blocked-harmful-page-learn-more",
    124    },
    125    addon: {
    126      title: "safeb-blocked-addon-page-title",
    127      shortDesc: "safeb-blocked-addon-page-short-desc",
    128      innerDescOverride: [
    129        "safeb-blocked-addon-page-error-desc-override",
    130        "safeb-blocked-addon-page-error-desc2-override",
    131        "",
    132        "safeb-blocked-addon-page-error-desc3-override",
    133        "safeb-blocked-addon-page-error-desc4-override",
    134      ],
    135      innerDescNoOverride: [
    136        "safeb-blocked-addon-page-error-desc-override",
    137        "safeb-blocked-addon-page-error-desc2-override",
    138        "",
    139        "safeb-blocked-addon-page-error-desc3-override",
    140        "safeb-blocked-addon-page-error-desc4-override",
    141      ],
    142      learnMore: "safeb-blocked-addon-page-learn-more",
    143    },
    144  };
    145 
    146  // Set page contents depending on type of blocked page
    147  // Prepare the title and short description text
    148  let titleText = document.getElementById("errorTitleText");
    149  document.l10n.setAttributes(titleText, messageIDs[error].title);
    150  let shortDesc = document.getElementById("errorShortDescText");
    151  document.l10n.setAttributes(shortDesc, messageIDs[error].shortDesc);
    152 
    153  // Prepare the inner description, ensuring any redundant inner elements are removed.
    154  let innerDesc = document.getElementById("errorInnerDescription");
    155  let innerDescL10nID;
    156  if (!getOverride()) {
    157    innerDescL10nID = messageIDs[error].innerDescNoOverride;
    158    document.getElementById("ignore_warning_link").remove();
    159  } else {
    160    innerDescL10nID = messageIDs[error].innerDescOverride;
    161  }
    162  if (error == "unwanted" || error == "harmful" || error == "addon") {
    163    document.getElementById("report_detection").remove();
    164  }
    165 
    166  const descArgs = {
    167    sitename: getHostString(),
    168    addonName: getAddonName(),
    169  };
    170 
    171  // Add the inner description:
    172  if (Array.isArray(innerDescL10nID)) {
    173    const template = innerDesc.cloneNode(true);
    174 
    175    while (innerDesc.firstChild) {
    176      innerDesc.firstChild.remove();
    177    }
    178 
    179    for (const id of innerDescL10nID) {
    180      if (id === "") {
    181        innerDesc.appendChild(document.createElement("br"));
    182      }
    183 
    184      const node = template.cloneNode(true);
    185      document.l10n.setAttributes(node, id, descArgs);
    186      innerDesc.appendChild(node);
    187    }
    188  } else {
    189    document.l10n.setAttributes(innerDesc, innerDescL10nID, descArgs);
    190  }
    191 
    192  // Add the learn more content:
    193  let learnMore = document.getElementById("learn_more");
    194  document.l10n.setAttributes(learnMore, messageIDs[error].learnMore);
    195 
    196  // Set sitename to bold by adding class
    197  let errorSitename = document.getElementById("error_desc_sitename");
    198  errorSitename.setAttribute("class", "sitename");
    199 
    200  let titleEl = document.createElement("title");
    201  document.l10n.setAttributes(titleEl, messageIDs[error].title);
    202  document.head.appendChild(titleEl);
    203 
    204  // Inform the test harness that we're done loading the page.
    205  var event = new CustomEvent("AboutBlockedLoaded", {
    206    bubbles: true,
    207    detail: {
    208      url: this.getURL(),
    209      err: error,
    210    },
    211  });
    212  document.dispatchEvent(event);
    213 }
    214 
    215 let seeDetailsButton = document.getElementById("seeDetailsButton");
    216 seeDetailsButton.addEventListener("click", onClickSeeDetails);
    217 // Note: It is important to run the script this way, instead of using
    218 // an onload handler. This is because error pages are loaded as
    219 // LOAD_BACKGROUND, which means that onload handlers will not be executed.
    220 initPage();