tor-browser

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

test_trr_extended_error.js (7438B)


      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
      3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      4 
      5 "use strict";
      6 
      7 trr_test_setup();
      8 registerCleanupFunction(async () => {
      9  trr_clear_prefs();
     10 });
     11 
     12 function makeChan(url) {
     13  let chan = NetUtil.newChannel({
     14    uri: url,
     15    loadUsingSystemPrincipal: true,
     16  }).QueryInterface(Ci.nsIHttpChannel);
     17  return chan;
     18 }
     19 
     20 function channelOpenPromise(chan) {
     21  return new Promise(resolve => {
     22    function finish(req, buffer) {
     23      resolve([req, buffer]);
     24    }
     25    chan.asyncOpen(new ChannelListener(finish));
     26  });
     27 }
     28 
     29 let trrServer;
     30 add_task(async function setup() {
     31  trrServer = new TRRServer();
     32  registerCleanupFunction(async () => {
     33    await trrServer.stop();
     34  });
     35  await trrServer.start();
     36  dump(`port = ${trrServer.port()}\n`);
     37  let chan = makeChan(`https://localhost:${trrServer.port()}/test?bla=some`);
     38  let [, resp] = await channelOpenPromise(chan);
     39  equal(resp, "<h1> 404 Path not found: /test</h1>");
     40 
     41  Services.dns.clearCache(true);
     42  Services.prefs.setIntPref("network.trr.mode", 2);
     43  Services.prefs.setCharPref(
     44    "network.trr.uri",
     45    `https://foo.example.com:${trrServer.port()}/dns-query`
     46  );
     47 });
     48 
     49 add_task(async function test_extended_error_1() {
     50  await trrServer.registerDoHAnswers("something.foo", "A", {
     51    answers: [
     52      {
     53        name: "something.foo",
     54        ttl: 55,
     55        type: "A",
     56        flush: false,
     57        data: "1.2.3.4",
     58      },
     59    ],
     60  });
     61 
     62  await new TRRDNSListener("something.foo", { expectedAnswer: "1.2.3.4" });
     63 
     64  await trrServer.registerDoHAnswers("a.foo", "A", {
     65    answers: [],
     66    additionals: [
     67      {
     68        name: ".",
     69        type: "OPT",
     70        class: "IN",
     71        options: [
     72          {
     73            code: "EDNS_ERROR",
     74            extended_error: 17, // Filtered
     75            text: "DNSSec bogus",
     76          },
     77        ],
     78      },
     79    ],
     80    flags: 2, // SERVFAIL
     81  });
     82 
     83  // Check that we don't fall back to DNS
     84  let { inStatus } = await new TRRDNSListener("a.foo", {
     85    expectedSuccess: false,
     86  });
     87  Assert.ok(
     88    !Components.isSuccessCode(inStatus),
     89    `${inStatus} should be an error code`
     90  );
     91 });
     92 
     93 add_task(async function test_extended_error_filtered() {
     94  await trrServer.registerDoHAnswers("b.foo", "A", {
     95    answers: [],
     96    additionals: [
     97      {
     98        name: ".",
     99        type: "OPT",
    100        class: "IN",
    101        options: [
    102          {
    103            code: "EDNS_ERROR",
    104            extended_error: 17, // Filtered
    105            text: "Filtered",
    106          },
    107        ],
    108      },
    109    ],
    110  });
    111 
    112  // Check that we don't fall back to DNS
    113  let { inStatus } = await new TRRDNSListener("b.foo", {
    114    expectedSuccess: false,
    115  });
    116  Assert.ok(
    117    !Components.isSuccessCode(inStatus),
    118    `${inStatus} should be an error code`
    119  );
    120 });
    121 
    122 add_task(async function test_extended_error_not_ready() {
    123  await trrServer.registerDoHAnswers("c.foo", "A", {
    124    answers: [],
    125    additionals: [
    126      {
    127        name: ".",
    128        type: "OPT",
    129        class: "IN",
    130        options: [
    131          {
    132            code: "EDNS_ERROR",
    133            extended_error: 14, // Not ready
    134            text: "Not ready",
    135          },
    136        ],
    137      },
    138    ],
    139  });
    140 
    141  // For this code it's OK to fallback
    142  await new TRRDNSListener("c.foo", { expectedAnswer: "127.0.0.1" });
    143 });
    144 
    145 add_task(async function ipv6_answer_and_delayed_ipv4_error() {
    146  // AAAA comes back immediately.
    147  // A EDNS_ERROR comes back later, with a delay
    148  await trrServer.registerDoHAnswers("delay1.com", "AAAA", {
    149    answers: [
    150      {
    151        name: "delay1.com",
    152        ttl: 55,
    153        type: "AAAA",
    154        flush: false,
    155        data: "::a:b:c:d",
    156      },
    157    ],
    158  });
    159  await trrServer.registerDoHAnswers("delay1.com", "A", {
    160    answers: [],
    161    additionals: [
    162      {
    163        name: ".",
    164        type: "OPT",
    165        class: "IN",
    166        options: [
    167          {
    168            code: "EDNS_ERROR",
    169            extended_error: 17, // Filtered
    170            text: "Filtered",
    171          },
    172        ],
    173      },
    174    ],
    175    delay: 200,
    176  });
    177 
    178  // Check that we don't fall back to DNS
    179  await new TRRDNSListener("delay1.com", { expectedAnswer: "::a:b:c:d" });
    180 });
    181 
    182 add_task(async function ipv4_error_and_delayed_ipv6_answer() {
    183  // AAAA comes back immediately delay
    184  // A EDNS_ERROR comes back immediately
    185  await trrServer.registerDoHAnswers("delay2.com", "AAAA", {
    186    answers: [
    187      {
    188        name: "delay2.com",
    189        ttl: 55,
    190        type: "AAAA",
    191        flush: false,
    192        data: "::a:b:c:d",
    193      },
    194    ],
    195    delay: 200,
    196  });
    197  await trrServer.registerDoHAnswers("delay2.com", "A", {
    198    answers: [],
    199    additionals: [
    200      {
    201        name: ".",
    202        type: "OPT",
    203        class: "IN",
    204        options: [
    205          {
    206            code: "EDNS_ERROR",
    207            extended_error: 17, // Filtered
    208            text: "Filtered",
    209          },
    210        ],
    211      },
    212    ],
    213  });
    214 
    215  // Check that we don't fall back to DNS
    216  await new TRRDNSListener("delay2.com", { expectedAnswer: "::a:b:c:d" });
    217 });
    218 
    219 add_task(async function ipv4_answer_and_delayed_ipv6_error() {
    220  // A comes back immediately.
    221  // AAAA EDNS_ERROR comes back later, with a delay
    222  await trrServer.registerDoHAnswers("delay3.com", "A", {
    223    answers: [
    224      {
    225        name: "delay3.com",
    226        ttl: 55,
    227        type: "A",
    228        flush: false,
    229        data: "1.2.3.4",
    230      },
    231    ],
    232  });
    233  await trrServer.registerDoHAnswers("delay3.com", "AAAA", {
    234    answers: [],
    235    additionals: [
    236      {
    237        name: ".",
    238        type: "OPT",
    239        class: "IN",
    240        options: [
    241          {
    242            code: "EDNS_ERROR",
    243            extended_error: 17, // Filtered
    244            text: "Filtered",
    245          },
    246        ],
    247      },
    248    ],
    249    delay: 200,
    250  });
    251 
    252  // Check that we don't fall back to DNS
    253  await new TRRDNSListener("delay3.com", { expectedAnswer: "1.2.3.4" });
    254 });
    255 
    256 add_task(async function delayed_ipv4_answer_and_ipv6_error() {
    257  // A comes back with delay.
    258  // AAAA EDNS_ERROR comes immediately
    259  await trrServer.registerDoHAnswers("delay4.com", "A", {
    260    answers: [
    261      {
    262        name: "delay4.com",
    263        ttl: 55,
    264        type: "A",
    265        flush: false,
    266        data: "1.2.3.4",
    267      },
    268    ],
    269    delay: 200,
    270  });
    271  await trrServer.registerDoHAnswers("delay4.com", "AAAA", {
    272    answers: [],
    273    additionals: [
    274      {
    275        name: ".",
    276        type: "OPT",
    277        class: "IN",
    278        options: [
    279          {
    280            code: "EDNS_ERROR",
    281            extended_error: 17, // Filtered
    282            text: "Filtered",
    283          },
    284        ],
    285      },
    286    ],
    287  });
    288 
    289  // Check that we don't fall back to DNS
    290  await new TRRDNSListener("delay4.com", { expectedAnswer: "1.2.3.4" });
    291 });
    292 
    293 add_task(async function test_only_ipv4_extended_error() {
    294  Services.prefs.setBoolPref("network.dns.disableIPv6", true);
    295  await trrServer.registerDoHAnswers("only.com", "A", {
    296    answers: [],
    297    additionals: [
    298      {
    299        name: ".",
    300        type: "OPT",
    301        class: "IN",
    302        options: [
    303          {
    304            code: "EDNS_ERROR",
    305            extended_error: 17, // Filtered
    306            text: "Filtered",
    307          },
    308        ],
    309      },
    310    ],
    311  });
    312  let { inStatus } = await new TRRDNSListener("only.com", {
    313    expectedSuccess: false,
    314  });
    315  Assert.ok(
    316    !Components.isSuccessCode(inStatus),
    317    `${inStatus} should be an error code`
    318  );
    319 });