tor-browser

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

head_errorhandler_common.js (6768B)


      1 /* Any copyright is dedicated to the Public Domain.
      2   http://creativecommons.org/publicdomain/zero/1.0/ */
      3 
      4 /* import-globals-from head_appinfo.js */
      5 /* import-globals-from ../../../common/tests/unit/head_helpers.js */
      6 /* import-globals-from head_helpers.js */
      7 /* import-globals-from head_http_server.js */
      8 
      9 // This file expects Service to be defined in the global scope when EHTestsCommon
     10 // is used (from service.js).
     11 /* global Service */
     12 
     13 var { Changeset, EngineManager, Store, SyncEngine, Tracker, LegacyTracker } =
     14  ChromeUtils.importESModule("resource://services-sync/engines.sys.mjs");
     15 var {
     16  ABORT_SYNC_COMMAND,
     17  CLIENT_NOT_CONFIGURED,
     18  CREDENTIALS_CHANGED,
     19  DEFAULT_DOWNLOAD_BATCH_SIZE,
     20  DEFAULT_GUID_FETCH_BATCH_SIZE,
     21  DEFAULT_KEYBUNDLE_NAME,
     22  DEVICE_TYPE_DESKTOP,
     23  DEVICE_TYPE_MOBILE,
     24  ENGINE_APPLY_FAIL,
     25  ENGINE_BATCH_INTERRUPTED,
     26  ENGINE_DOWNLOAD_FAIL,
     27  ENGINE_SUCCEEDED,
     28  ENGINE_UNKNOWN_FAIL,
     29  ENGINE_UPLOAD_FAIL,
     30  HMAC_EVENT_INTERVAL,
     31  IDLE_OBSERVER_BACK_DELAY,
     32  LOGIN_FAILED,
     33  LOGIN_FAILED_INVALID_PASSPHRASE,
     34  LOGIN_FAILED_LOGIN_REJECTED,
     35  LOGIN_FAILED_NETWORK_ERROR,
     36  LOGIN_FAILED_NO_PASSPHRASE,
     37  LOGIN_FAILED_NO_USERNAME,
     38  LOGIN_FAILED_SERVER_ERROR,
     39  LOGIN_SUCCEEDED,
     40  MASTER_PASSWORD_LOCKED,
     41  MASTER_PASSWORD_LOCKED_RETRY_INTERVAL,
     42  MAXIMUM_BACKOFF_INTERVAL,
     43  MAX_ERROR_COUNT_BEFORE_BACKOFF,
     44  MAX_HISTORY_DOWNLOAD,
     45  MAX_HISTORY_UPLOAD,
     46  METARECORD_DOWNLOAD_FAIL,
     47  MINIMUM_BACKOFF_INTERVAL,
     48  MULTI_DEVICE_THRESHOLD,
     49  NO_SYNC_NODE_FOUND,
     50  NO_SYNC_NODE_INTERVAL,
     51  OVER_QUOTA,
     52  PREFS_BRANCH,
     53  RESPONSE_OVER_QUOTA,
     54  SCORE_INCREMENT_MEDIUM,
     55  SCORE_INCREMENT_SMALL,
     56  SCORE_INCREMENT_XLARGE,
     57  SCORE_UPDATE_DELAY,
     58  SERVER_MAINTENANCE,
     59  SINGLE_USER_THRESHOLD,
     60  SQLITE_MAX_VARIABLE_NUMBER,
     61  STATUS_DISABLED,
     62  STATUS_OK,
     63  STORAGE_VERSION,
     64  SYNC_FAILED,
     65  SYNC_FAILED_PARTIAL,
     66  SYNC_KEY_DECODED_LENGTH,
     67  SYNC_KEY_ENCODED_LENGTH,
     68  SYNC_SUCCEEDED,
     69  URI_LENGTH_MAX,
     70  VERSION_OUT_OF_DATE,
     71  WEAVE_VERSION,
     72  kFirefoxShuttingDown,
     73  kFirstSyncChoiceNotMade,
     74  kSyncBackoffNotMet,
     75  kSyncMasterPasswordLocked,
     76  kSyncNetworkOffline,
     77  kSyncNotConfigured,
     78  kSyncWeaveDisabled,
     79 } = ChromeUtils.importESModule("resource://services-sync/constants.sys.mjs");
     80 var { BulkKeyBundle, SyncKeyBundle } = ChromeUtils.importESModule(
     81  "resource://services-sync/keys.sys.mjs"
     82 );
     83 
     84 // Common code for test_errorhandler_{1,2}.js -- pulled out to make it less
     85 // monolithic and take less time to execute.
     86 const EHTestsCommon = {
     87  service_unavailable(request, response) {
     88    let body = "Service Unavailable";
     89    response.setStatusLine(request.httpVersion, 503, "Service Unavailable");
     90    response.setHeader("Retry-After", "42");
     91    response.bodyOutputStream.write(body, body.length);
     92  },
     93 
     94  async sync_httpd_setup() {
     95    let clientsEngine = Service.clientsEngine;
     96    let clientsSyncID = await clientsEngine.resetLocalSyncID();
     97    let catapultEngine = Service.engineManager.get("catapult");
     98    let catapultSyncID = await catapultEngine.resetLocalSyncID();
     99    let global = new ServerWBO("global", {
    100      syncID: Service.syncID,
    101      storageVersion: STORAGE_VERSION,
    102      engines: {
    103        clients: { version: clientsEngine.version, syncID: clientsSyncID },
    104        catapult: { version: catapultEngine.version, syncID: catapultSyncID },
    105      },
    106    });
    107    let clientsColl = new ServerCollection({}, true);
    108 
    109    // Tracking info/collections.
    110    let collectionsHelper = track_collections_helper();
    111    let upd = collectionsHelper.with_updated_collection;
    112 
    113    let handler_401 = httpd_handler(401, "Unauthorized");
    114    return httpd_setup({
    115      // Normal server behaviour.
    116      "/1.1/johndoe/storage/meta/global": upd("meta", global.handler()),
    117      "/1.1/johndoe/info/collections": collectionsHelper.handler,
    118      "/1.1/johndoe/storage/crypto/keys": upd(
    119        "crypto",
    120        new ServerWBO("keys").handler()
    121      ),
    122      "/1.1/johndoe/storage/clients": upd("clients", clientsColl.handler()),
    123 
    124      // Credentials are wrong or node reallocated.
    125      "/1.1/janedoe/storage/meta/global": handler_401,
    126      "/1.1/janedoe/info/collections": handler_401,
    127 
    128      // Maintenance or overloaded (503 + Retry-After) at info/collections.
    129      "/1.1/broken.info/info/collections": EHTestsCommon.service_unavailable,
    130 
    131      // Maintenance or overloaded (503 + Retry-After) at meta/global.
    132      "/1.1/broken.meta/storage/meta/global": EHTestsCommon.service_unavailable,
    133      "/1.1/broken.meta/info/collections": collectionsHelper.handler,
    134 
    135      // Maintenance or overloaded (503 + Retry-After) at crypto/keys.
    136      "/1.1/broken.keys/storage/meta/global": upd("meta", global.handler()),
    137      "/1.1/broken.keys/info/collections": collectionsHelper.handler,
    138      "/1.1/broken.keys/storage/crypto/keys": EHTestsCommon.service_unavailable,
    139 
    140      // Maintenance or overloaded (503 + Retry-After) at wiping collection.
    141      "/1.1/broken.wipe/info/collections": collectionsHelper.handler,
    142      "/1.1/broken.wipe/storage/meta/global": upd("meta", global.handler()),
    143      "/1.1/broken.wipe/storage/crypto/keys": upd(
    144        "crypto",
    145        new ServerWBO("keys").handler()
    146      ),
    147      "/1.1/broken.wipe/storage": EHTestsCommon.service_unavailable,
    148      "/1.1/broken.wipe/storage/clients": upd("clients", clientsColl.handler()),
    149      "/1.1/broken.wipe/storage/catapult": EHTestsCommon.service_unavailable,
    150    });
    151  },
    152 
    153  CatapultEngine: (function () {
    154    function CatapultEngine() {
    155      SyncEngine.call(this, "Catapult", Service);
    156    }
    157    CatapultEngine.prototype = {
    158      exception: null, // tests fill this in
    159      async _sync() {
    160        if (this.exception) {
    161          throw this.exception;
    162        }
    163      },
    164    };
    165    Object.setPrototypeOf(CatapultEngine.prototype, SyncEngine.prototype);
    166 
    167    return CatapultEngine;
    168  })(),
    169 
    170  async generateCredentialsChangedFailure() {
    171    // Make sync fail due to changed credentials. We simply re-encrypt
    172    // the keys with a different Sync Key, without changing the local one.
    173    let newSyncKeyBundle = new BulkKeyBundle("crypto");
    174    await newSyncKeyBundle.generateRandom();
    175    let keys = Service.collectionKeys.asWBO();
    176    await keys.encrypt(newSyncKeyBundle);
    177    return keys.upload(Service.resource(Service.cryptoKeysURL));
    178  },
    179 
    180  async setUp(server) {
    181    syncTestLogging();
    182    await configureIdentity({ username: "johndoe" }, server);
    183    return EHTestsCommon.generateAndUploadKeys();
    184  },
    185 
    186  async generateAndUploadKeys() {
    187    await generateNewKeys(Service.collectionKeys);
    188    let serverKeys = Service.collectionKeys.asWBO("crypto", "keys");
    189    await serverKeys.encrypt(Service.identity.syncKeyBundle);
    190    let response = await serverKeys.upload(
    191      Service.resource(Service.cryptoKeysURL)
    192    );
    193    return response.success;
    194  },
    195 };