tor-browser

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

test_trr_additional_section.js (9149B)


      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 = new TRRServer();
     30 registerCleanupFunction(async () => {
     31  await trrServer.stop();
     32 });
     33 add_task(async function setup_server() {
     34  await trrServer.start();
     35  dump(`port = ${trrServer.port()}\n`);
     36  let chan = makeChan(`https://localhost:${trrServer.port()}/test?bla=some`);
     37  let [, resp] = await channelOpenPromise(chan);
     38  equal(resp, "<h1> 404 Path not found: /test</h1>");
     39 });
     40 
     41 add_task(async function test_parse_additional_section() {
     42  Services.dns.clearCache(true);
     43  Services.prefs.setIntPref("network.trr.mode", 3);
     44  Services.prefs.setCharPref(
     45    "network.trr.uri",
     46    `https://foo.example.com:${trrServer.port()}/dns-query`
     47  );
     48 
     49  await trrServer.registerDoHAnswers("something.foo", "A", {
     50    answers: [
     51      {
     52        name: "something.foo",
     53        ttl: 55,
     54        type: "A",
     55        flush: false,
     56        data: "1.2.3.4",
     57      },
     58    ],
     59    additionals: [
     60      {
     61        name: "else.foo",
     62        ttl: 55,
     63        type: "A",
     64        flush: false,
     65        data: "2.3.4.5",
     66      },
     67    ],
     68  });
     69 
     70  await new TRRDNSListener("something.foo", { expectedAnswer: "1.2.3.4" });
     71  await new TRRDNSListener("else.foo", { expectedAnswer: "2.3.4.5" });
     72 
     73  await trrServer.registerDoHAnswers("a.foo", "A", {
     74    answers: [
     75      {
     76        name: "a.foo",
     77        ttl: 55,
     78        type: "A",
     79        flush: false,
     80        data: "1.2.3.4",
     81      },
     82    ],
     83    additionals: [
     84      {
     85        name: "b.foo",
     86        ttl: 55,
     87        type: "A",
     88        flush: false,
     89        data: "2.3.4.5",
     90      },
     91    ],
     92  });
     93  await trrServer.registerDoHAnswers("b.foo", "A", {
     94    answers: [
     95      {
     96        name: "b.foo",
     97        ttl: 55,
     98        type: "A",
     99        flush: false,
    100        data: "3.4.5.6",
    101      },
    102    ],
    103  });
    104 
    105  let req1 = new TRRDNSListener("a.foo", { expectedAnswer: "1.2.3.4" });
    106 
    107  // A request for b.foo will be in progress by the time we parse the additional
    108  // record. To keep things simple we don't end up saving the record, instead
    109  // we wait for the in-progress request to complete.
    110  // This check is also racy - if the response for a.foo completes before we make
    111  // this request, we'll put the other IP in the cache. But that is very unlikely.
    112  let req2 = new TRRDNSListener("b.foo", { expectedAnswer: "3.4.5.6" });
    113 
    114  await Promise.all([req1, req2]);
    115 
    116  // IPv6 additional
    117  await trrServer.registerDoHAnswers("xyz.foo", "A", {
    118    answers: [
    119      {
    120        name: "xyz.foo",
    121        ttl: 55,
    122        type: "A",
    123        flush: false,
    124        data: "1.2.3.4",
    125      },
    126    ],
    127    additionals: [
    128      {
    129        name: "abc.foo",
    130        ttl: 55,
    131        type: "AAAA",
    132        flush: false,
    133        data: "::1:2:3:4",
    134      },
    135    ],
    136  });
    137 
    138  await new TRRDNSListener("xyz.foo", { expectedAnswer: "1.2.3.4" });
    139  await new TRRDNSListener("abc.foo", { expectedAnswer: "::1:2:3:4" });
    140 
    141  // IPv6 additional
    142  await trrServer.registerDoHAnswers("ipv6.foo", "AAAA", {
    143    answers: [
    144      {
    145        name: "ipv6.foo",
    146        ttl: 55,
    147        type: "AAAA",
    148        flush: false,
    149        data: "2001::a:b:c:d",
    150      },
    151    ],
    152    additionals: [
    153      {
    154        name: "def.foo",
    155        ttl: 55,
    156        type: "AAAA",
    157        flush: false,
    158        data: "::a:b:c:d",
    159      },
    160    ],
    161  });
    162 
    163  await new TRRDNSListener("ipv6.foo", { expectedAnswer: "2001::a:b:c:d" });
    164  await new TRRDNSListener("def.foo", { expectedAnswer: "::a:b:c:d" });
    165 
    166  // IPv6 additional
    167  await trrServer.registerDoHAnswers("ipv6b.foo", "AAAA", {
    168    answers: [
    169      {
    170        name: "ipv6b.foo",
    171        ttl: 55,
    172        type: "AAAA",
    173        flush: false,
    174        data: "2001::a:b:c:d",
    175      },
    176    ],
    177    additionals: [
    178      {
    179        name: "qqqq.foo",
    180        ttl: 55,
    181        type: "A",
    182        flush: false,
    183        data: "9.8.7.6",
    184      },
    185    ],
    186  });
    187 
    188  await new TRRDNSListener("ipv6b.foo", { expectedAnswer: "2001::a:b:c:d" });
    189  await new TRRDNSListener("qqqq.foo", { expectedAnswer: "9.8.7.6" });
    190 
    191  // Multiple IPs and multiple additional records
    192  await trrServer.registerDoHAnswers("multiple.foo", "A", {
    193    answers: [
    194      {
    195        name: "multiple.foo",
    196        ttl: 55,
    197        type: "A",
    198        flush: false,
    199        data: "9.9.9.9",
    200      },
    201    ],
    202    additionals: [
    203      {
    204        // Should be ignored, because it should be in the answer section
    205        name: "multiple.foo",
    206        ttl: 55,
    207        type: "A",
    208        flush: false,
    209        data: "1.1.1.1",
    210      },
    211      {
    212        // Is ignored, because it should be in the answer section
    213        name: "multiple.foo",
    214        ttl: 55,
    215        type: "AAAA",
    216        flush: false,
    217        data: "2001::a:b:c:d",
    218      },
    219      {
    220        name: "yuiop.foo",
    221        ttl: 55,
    222        type: "AAAA",
    223        flush: false,
    224        data: "2001::a:b:c:d",
    225      },
    226      {
    227        name: "yuiop.foo",
    228        ttl: 55,
    229        type: "A",
    230        flush: false,
    231        data: "1.2.3.4",
    232      },
    233    ],
    234  });
    235 
    236  let { inRecord } = await new TRRDNSListener("multiple.foo", {
    237    expectedAnswer: "9.9.9.9",
    238  });
    239  let IPs = [];
    240  inRecord.QueryInterface(Ci.nsIDNSAddrRecord);
    241  inRecord.rewind();
    242  while (inRecord.hasMore()) {
    243    IPs.push(inRecord.getNextAddrAsString());
    244  }
    245  equal(IPs.length, 1);
    246  equal(IPs[0], "9.9.9.9");
    247  IPs = [];
    248  ({ inRecord } = await new TRRDNSListener("yuiop.foo", {
    249    expectedSuccess: false,
    250  }));
    251  inRecord.QueryInterface(Ci.nsIDNSAddrRecord);
    252  inRecord.rewind();
    253  while (inRecord.hasMore()) {
    254    IPs.push(inRecord.getNextAddrAsString());
    255  }
    256  equal(IPs.length, 2);
    257  equal(IPs[0], "2001::a:b:c:d");
    258  equal(IPs[1], "1.2.3.4");
    259 });
    260 
    261 add_task(async function test_additional_after_resolve() {
    262  await trrServer.registerDoHAnswers("first.foo", "A", {
    263    answers: [
    264      {
    265        name: "first.foo",
    266        ttl: 55,
    267        type: "A",
    268        flush: false,
    269        data: "3.4.5.6",
    270      },
    271    ],
    272  });
    273  await new TRRDNSListener("first.foo", { expectedAnswer: "3.4.5.6" });
    274 
    275  await trrServer.registerDoHAnswers("second.foo", "A", {
    276    answers: [
    277      {
    278        name: "second.foo",
    279        ttl: 55,
    280        type: "A",
    281        flush: false,
    282        data: "1.2.3.4",
    283      },
    284    ],
    285    additionals: [
    286      {
    287        name: "first.foo",
    288        ttl: 55,
    289        type: "A",
    290        flush: false,
    291        data: "2.3.4.5",
    292      },
    293    ],
    294  });
    295 
    296  await new TRRDNSListener("second.foo", { expectedAnswer: "1.2.3.4" });
    297  await new TRRDNSListener("first.foo", { expectedAnswer: "2.3.4.5" });
    298 });
    299 
    300 // test for Bug - 1790075
    301 // Crash was observed when a DNS (using TRR) reply contains an additional
    302 // record field and this addditional record was previously unsuccessfully
    303 // resolved
    304 add_task(async function test_additional_cached_record_override() {
    305  Services.dns.clearCache(true);
    306  Services.prefs.setIntPref("network.trr.mode", 2);
    307  Services.prefs.setCharPref(
    308    "network.trr.uri",
    309    `https://foo.example.com:${trrServer.port()}/dns-query`
    310  );
    311 
    312  await new TRRDNSListener("else.foo", { expectedAnswer: "127.0.0.1" });
    313 
    314  await trrServer.registerDoHAnswers("something.foo", "A", {
    315    answers: [
    316      {
    317        name: "something.foo",
    318        ttl: 55,
    319        type: "A",
    320        flush: false,
    321        data: "1.2.3.4",
    322      },
    323    ],
    324    additionals: [
    325      {
    326        name: "else.foo",
    327        ttl: 55,
    328        type: "A",
    329        flush: false,
    330        data: "2.3.4.5",
    331      },
    332    ],
    333  });
    334 
    335  await new TRRDNSListener("something.foo", { expectedAnswer: "1.2.3.4" });
    336  await new TRRDNSListener("else.foo", { expectedAnswer: "2.3.4.5" });
    337 });
    338 
    339 add_task(async function test_ipv6_disabled() {
    340  Services.prefs.setBoolPref("network.dns.disableIPv6", true);
    341  await trrServer.registerDoHAnswers("ipv6.foo", "A", {
    342    answers: [
    343      {
    344        name: "ipv6.foo",
    345        ttl: 55,
    346        type: "A",
    347        flush: false,
    348        data: "1.2.3.4",
    349      },
    350    ],
    351    additionals: [
    352      {
    353        name: "sub.ipv6.foo",
    354        ttl: 55,
    355        type: "AAAA",
    356        flush: false,
    357        data: "::1:2:3:4",
    358      },
    359    ],
    360  });
    361 
    362  await new TRRDNSListener("ipv6.foo", { expectedAnswer: "1.2.3.4" });
    363  await new TRRDNSListener("sub.ipv6.foo", { expectedSuccess: false });
    364 
    365  await trrServer.registerDoHAnswers("direct.ipv6.foo", "AAAA", {
    366    answers: [
    367      {
    368        name: "direct.ipv6.foo",
    369        ttl: 55,
    370        type: "AAAA",
    371        flush: false,
    372        data: "2001::a:b:c:d",
    373      },
    374    ],
    375  });
    376 
    377  await new TRRDNSListener("direct.ipv6.foo", { expectedSuccess: false });
    378 
    379  Services.prefs.setBoolPref("network.dns.disableIPv6", false);
    380 });