Skip to content
Snippets Groups Projects
app.js 4.79 KiB
Newer Older
  • Learn to ignore specific revisions
  • const { SettingsManager } = require("./SettingsManager");
    
    const { TokenManager } = require("./TokenManager");
    
    let settingsManager = new SettingsManager();
    
    let tokenManager = new TokenManager();
    
    
    if (typeof browser == "undefined") {
      var browser = chrome;
    }
    
    Dominik Hebeler's avatar
    Dominik Hebeler committed
    
    
    /**
     * Handle messages between content scripts and background script:
     * 1. Handles events where the user changed search settings so they
     *    can be synchronized with the extension storage.
     * 2. Handle attaching anonymous tokens to the search request of the user
     *    so the request can be properly authorized.
     */
    
    browser.runtime.onMessage.addListener((request, sender, sendResponse) => {
      if (!request.hasOwnProperty("type")) return;
      if (request.type == "settings_set" && request.hasOwnProperty("settings")) {
        settingsManager.set(request.settings).then(() => {
          sendResponse({ status: "ok" });
    
        }).catch(error => {
          console.trace(error);
          sendResponse({ status: "error" });
    
        return true;
    
      }
      if (request.type == "settings_remove" && request.hasOwnProperty("setting_key")) {
    
        if (request.setting_key == "key") {
          tokenManager.store_key(null).then(() => {
            sendResponse({ status: "ok" });
    
          }).catch(error => {
            console.trace(error);
            sendResponse({ status: "error" });
    
          });
        } else {
          settingsManager.remove(request.setting_key).then(() => {
            sendResponse({ status: "ok" });
    
          }).catch(error => {
            console.trace(error);
            sendResponse({ status: "error" });
    
        return true;
    
      if (request.type == "tokenauthorization") {
    
        tokenManager.prepare_token_auth(request.cost).then(() => {
    
          sendResponse({ status: "ok" });
    
        }).catch(error => {
    
          console.trace(error);
    
          sendResponse({ status: "error" });
    
        });
        return true;
      }
    
    /**
     * When the user enables/disables storage of settings within this
     * web-extension we'll grab all existing settings and put it into
    
    Dominik Hebeler's avatar
    Dominik Hebeler committed
     * the web-extension or vise versa.
     * Those settings will also be disabled if the user removes the necessary
     * host permissions from the extension or enabled if they get externally granted
     * and the user already enabled storage of the settings
    
    browser.storage.onChanged.addListener(async (changes, areaName) => {
    
      settingsManager.handleStorageChange(changes);
      tokenManager.handleStorageChange(changes);
    
    browser.permissions.onAdded.addListener(async (permissions) => {
      await settingsManager.handlePermissionsChange(permissions);
    
      await tokenManager.handlePermissionsChange(permissions);
    
    });
    browser.permissions.onRemoved.addListener(async (permissions) => {
      await settingsManager.handlePermissionsChange(permissions);
    
      await tokenManager.handlePermissionsChange(permissions);
    
    Dominik Hebeler's avatar
    Dominik Hebeler committed
     * Make sure we also catch changes in search settings when they
     * are added i.e. using the dev tools or the setting cookies
     * are getting restored in other ways.
     */
    browser.cookies.onChanged.addListener(async changeInfo => {
      await settingsManager.handleCookieChange(changeInfo);
      await tokenManager.handleCookieChange(changeInfo);
    })
    
    /**
     * Alternatively catch changes in search settings by parsing the
     * cookies in response headers to make sure the webextensions
     * stores all search settings consistently.
    
    Dominik Hebeler's avatar
    Dominik Hebeler committed
     * Headers will not be modified in those listeners.
    
    let extraInfoSpecRequest = ["requestHeaders"];
    if (BROWSER == "CHROME") {
      extraInfoSpecRequest.push("extraHeaders");
    }
    
    browser.webRequest.onBeforeSendHeaders.addListener(
    
      async (details) => {
        let headers = await tokenManager.handleRequestHeaders(details);
        return { requestHeaders: headers };
      },
      {
        urls: ["https://metager.org/*", "https://metager.de/*"],
      },
    
      extraInfoSpecRequest
    
    let extraInfoSpecResponse = ["responseHeaders"];
    if (BROWSER == "CHROME") {
      extraInfoSpecResponse.push("extraHeaders");
    }
    
    browser.webRequest.onHeadersReceived.addListener(
    
        settingsManager.handleResponseHeaders(details);
        tokenManager.handleResponseHeaders(details);
    
      },
      {
        urls: ["https://metager.org/*", "https://metager.de/*"],
      },
    
      extraInfoSpecResponse
    
    
    /**
     * Open settings page when user installs the addon
     * as additional permissions might be required to use
     * all features of this extension.
     * Opening the page on update is not required if the user comes from
     * a version that already has a settings page included
     */
    browser.runtime.onInstalled.addListener(details => {
      let open_settings_page = false;
    
    
      if (details.reason == "update" && details.previousVersion == "0.0.1.3") {
    
        open_settings_page = true;
      }
    
      if (details.reason == "install") {
        open_settings_page = true;
      }
    
      if (details.temporary == true) {
        open_settings_page = false;
      }
    
      if (open_settings_page) {
        browser.runtime.openOptionsPage();
      }
    })