test_trr_case_sensitivity.js (3835B)
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 add_task(async function test_trr_casing() { 30 let trrServer = new TRRServer(); 31 registerCleanupFunction(async () => { 32 await trrServer.stop(); 33 }); 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 Services.dns.clearCache(true); 41 Services.prefs.setIntPref("network.trr.mode", 3); 42 Services.prefs.setCharPref( 43 "network.trr.uri", 44 `https://foo.example.com:${trrServer.port()}/dns-query` 45 ); 46 47 // This CNAME response goes to B.example.com (uppercased) 48 // It should be lowercased by the code 49 await trrServer.registerDoHAnswers("a.example.com", "A", { 50 answers: [ 51 { 52 name: "a.example.com", 53 ttl: 55, 54 type: "CNAME", 55 flush: false, 56 data: "B.example.com", 57 }, 58 ], 59 }); 60 // Like in bug 1635566, the response for B.example.com will be lowercased 61 // by the server too -> b.example.com 62 // Requesting this resource would case the browser to reject the resource 63 await trrServer.registerDoHAnswers("B.example.com", "A", { 64 answers: [ 65 { 66 name: "b.example.com", 67 ttl: 55, 68 type: "CNAME", 69 flush: false, 70 data: "c.example.com", 71 }, 72 ], 73 }); 74 75 // The browser should request this one 76 await trrServer.registerDoHAnswers("b.example.com", "A", { 77 answers: [ 78 { 79 name: "b.example.com", 80 ttl: 55, 81 type: "CNAME", 82 flush: false, 83 data: "c.example.com", 84 }, 85 ], 86 }); 87 // Finally, it gets an IP 88 await trrServer.registerDoHAnswers("c.example.com", "A", { 89 answers: [ 90 { 91 name: "c.example.com", 92 ttl: 55, 93 type: "A", 94 flush: false, 95 data: "1.2.3.4", 96 }, 97 ], 98 }); 99 await new TRRDNSListener("a.example.com", { expectedAnswer: "1.2.3.4" }); 100 101 await trrServer.registerDoHAnswers("a.test.com", "A", { 102 answers: [ 103 { 104 name: "a.test.com", 105 ttl: 55, 106 type: "CNAME", 107 flush: false, 108 data: "B.test.com", 109 }, 110 ], 111 }); 112 // We try this again, this time we explicitly make sure this resource 113 // is never used 114 await trrServer.registerDoHAnswers("B.test.com", "A", { 115 answers: [ 116 { 117 name: "B.test.com", 118 ttl: 55, 119 type: "A", 120 flush: false, 121 data: "9.9.9.9", 122 }, 123 ], 124 }); 125 await trrServer.registerDoHAnswers("b.test.com", "A", { 126 answers: [ 127 { 128 name: "b.test.com", 129 ttl: 55, 130 type: "A", 131 flush: false, 132 data: "8.8.8.8", 133 }, 134 ], 135 }); 136 await new TRRDNSListener("a.test.com", { expectedAnswer: "8.8.8.8" }); 137 138 await trrServer.registerDoHAnswers("capital.com", "A", { 139 answers: [ 140 { 141 name: "capital.com", 142 ttl: 55, 143 type: "A", 144 flush: false, 145 data: "2.2.2.2", 146 }, 147 ], 148 }); 149 await new TRRDNSListener("CAPITAL.COM", { expectedAnswer: "2.2.2.2" }); 150 await new TRRDNSListener("CAPITAL.COM.", { expectedAnswer: "2.2.2.2" }); 151 152 await trrServer.stop(); 153 });