summaryrefslogtreecommitdiffstats
path: root/netwerk/test/unit/test_trr_proxy_auth.js
diff options
context:
space:
mode:
Diffstat (limited to 'netwerk/test/unit/test_trr_proxy_auth.js')
-rw-r--r--netwerk/test/unit/test_trr_proxy_auth.js122
1 files changed, 122 insertions, 0 deletions
diff --git a/netwerk/test/unit/test_trr_proxy_auth.js b/netwerk/test/unit/test_trr_proxy_auth.js
new file mode 100644
index 0000000000..0576514486
--- /dev/null
+++ b/netwerk/test/unit/test_trr_proxy_auth.js
@@ -0,0 +1,122 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+"use strict";
+
+/* import-globals-from head_cache.js */
+/* import-globals-from head_cookies.js */
+/* import-globals-from head_channels.js */
+/* import-globals-from head_servers.js */
+
+function setup() {
+ trr_test_setup();
+ Services.prefs.setBoolPref("network.trr.fetch_off_main_thread", true);
+}
+
+setup();
+registerCleanupFunction(async () => {
+ trr_clear_prefs();
+});
+
+function AuthPrompt() {}
+
+AuthPrompt.prototype = {
+ user: "guest",
+ pass: "guest",
+
+ QueryInterface: ChromeUtils.generateQI(["nsIAuthPrompt2"]),
+
+ promptAuth: function ap_promptAuth(channel, level, authInfo) {
+ authInfo.username = this.user;
+ authInfo.password = this.pass;
+
+ return true;
+ },
+
+ asyncPromptAuth: function ap_async(chan, cb, ctx, lvl, info) {
+ throw Components.Exception("", Cr.NS_ERROR_NOT_IMPLEMENTED);
+ },
+};
+
+function Requestor() {}
+
+Requestor.prototype = {
+ QueryInterface: ChromeUtils.generateQI(["nsIInterfaceRequestor"]),
+
+ getInterface: function requestor_gi(iid) {
+ if (iid.equals(Ci.nsIAuthPrompt2)) {
+ // Allow the prompt to store state by caching it here
+ if (!this.prompt) {
+ this.prompt = new AuthPrompt();
+ }
+ return this.prompt;
+ }
+
+ throw Components.Exception("", Cr.NS_ERROR_NO_INTERFACE);
+ },
+
+ prompt: null,
+};
+
+// Test if we successfully retry TRR request on main thread.
+add_task(async function test_trr_proxy_auth() {
+ let certdb = Cc["@mozilla.org/security/x509certdb;1"].getService(
+ Ci.nsIX509CertDB
+ );
+ addCertFromFile(certdb, "http2-ca.pem", "CTu,u,u");
+ addCertFromFile(certdb, "proxy-ca.pem", "CTu,u,u");
+
+ let trrServer = new TRRServer();
+ await trrServer.start();
+ Services.prefs.setIntPref("network.trr.mode", 3);
+ Services.prefs.setCharPref(
+ "network.trr.uri",
+ `https://foo.example.com:${trrServer.port}/dns-query`
+ );
+
+ await trrServer.registerDoHAnswers("test.proxy.com", "A", {
+ answers: [
+ {
+ name: "test.proxy.com",
+ ttl: 55,
+ type: "A",
+ flush: false,
+ data: "3.3.3.3",
+ },
+ ],
+ });
+
+ await new TRRDNSListener("test.proxy.com", "3.3.3.3");
+
+ let proxy = new NodeHTTP2ProxyServer();
+ await proxy.start(0, true);
+ registerCleanupFunction(async () => {
+ await proxy.stop();
+ await trrServer.stop();
+ });
+
+ let authTriggered = false;
+ let observer = {
+ QueryInterface: ChromeUtils.generateQI(["nsIObserver"]),
+ observe(aSubject, aTopic, aData) {
+ if (aTopic == "http-on-examine-response") {
+ Services.obs.removeObserver(observer, "http-on-examine-response");
+ let channel = aSubject.QueryInterface(Ci.nsIChannel);
+ channel.notificationCallbacks = new Requestor();
+ if (
+ channel.URI.spec.startsWith(
+ `https://foo.example.com:${trrServer.port}/dns-query`
+ )
+ ) {
+ authTriggered = true;
+ }
+ }
+ },
+ };
+ Services.obs.addObserver(observer, "http-on-examine-response");
+
+ Services.dns.clearCache(true);
+ await new TRRDNSListener("test.proxy.com", "3.3.3.3");
+ Assert.ok(authTriggered);
+});