/* 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";
const lazy = {};
// Ensure DNS lookups don't hit the server
XPCOMUtils.defineLazyServiceGetter(
lazy,
"gDNSOverride",
"@mozilla.org/network/native-dns-override;1",
"nsINativeDNSResolverOverride"
);
add_task(async
function setup() {
Services.prefs.setStringPref(
"browser.fixup.alternate.prefix",
"www.");
Services.prefs.setStringPref(
"browser.fixup.alternate.suffix",
".com");
Services.prefs.setStringPref(
"browser.fixup.alternate.protocol",
"https");
Services.prefs.setBoolPref(
"browser.urlbar.dnsResolveFullyQualifiedNames",
true
);
registerCleanupFunction(
function () {
Services.prefs.clearUserPref(
"browser.fixup.alternate.prefix");
Services.prefs.clearUserPref(
"browser.fixup.alternate.suffix");
Services.prefs.clearUserPref(
"browser.fixup.alternate.protocol");
Services.prefs.clearUserPref(
"browser.urlbar.dnsResolveFullyQualifiedNames"
);
});
});
// TODO: Export Listener from test_dns_override instead of duping
class Listener {
constructor() {
this.promise =
new Promise(resolve => {
this.resolve = resolve;
});
}
onLookupComplete(inRequest, inRecord, inStatus) {
this.resolve([inRequest, inRecord, inStatus]);
}
async firstAddress() {
let all = await
this.addresses();
if (all.length) {
return all[0];
}
return undefined;
}
async addresses() {
let [, inRecord] = await
this.promise;
let addresses = [];
if (!inRecord) {
return addresses;
// returns []
}
inRecord.QueryInterface(Ci.nsIDNSAddrRecord);
while (inRecord.hasMore()) {
addresses.push(inRecord.getNextAddrAsString());
}
return addresses;
}
then() {
return this.promise.then.apply(
this.promise, arguments);
}
}
const FAKE_IP =
"::1";
const FAKE_INTRANET_IP =
"::2";
const ORIGIN_ATTRIBUTE = {};
add_task(async
function test_uri_with_force_fixup() {
let listener =
new Listener();
let { fixedURI } = Services.uriFixup.forceHttpFixup(
"http://www.example.com");
lazy.gDNSOverride.addIPOverride(fixedURI.displayHost, FAKE_IP);
Services.uriFixup.checkHost(fixedURI, listener, ORIGIN_ATTRIBUTE);
Assert.equal(
await listener.firstAddress(),
FAKE_IP,
"Should've received fake IP"
);
lazy.gDNSOverride.clearHostOverride(fixedURI.displayHost);
Services.dns.clearCache(
false);
});
add_task(async
function test_uri_with_get_fixup() {
let listener =
new Listener();
let uri = Services.io.newURI(
"http://www.example.com");
lazy.gDNSOverride.addIPOverride(uri.displayHost, FAKE_IP);
Services.uriFixup.checkHost(uri, listener, ORIGIN_ATTRIBUTE);
Assert.equal(
await listener.firstAddress(),
FAKE_IP,
"Should've received fake IP"
);
lazy.gDNSOverride.clearHostOverride(uri.displayHost);
Services.dns.clearCache(
false);
});
add_task(async
function test_intranet_like_uri() {
let listener =
new Listener();
let uri = Services.io.newURI(
"http://someintranet");
lazy.gDNSOverride.addIPOverride(uri.displayHost, FAKE_IP);
// Hosts without periods should end with a period to make them FQN
lazy.gDNSOverride.addIPOverride(uri.displayHost +
".", FAKE_INTRANET_IP);
Services.uriFixup.checkHost(uri, listener, ORIGIN_ATTRIBUTE);
Assert.deepEqual(
await listener.addresses(),
FAKE_INTRANET_IP,
"Should've received fake intranet IP"
);
lazy.gDNSOverride.clearHostOverride(uri.displayHost);
lazy.gDNSOverride.clearHostOverride(uri.displayHost +
".");
Services.dns.clearCache(
false);
});
add_task(async
function test_intranet_like_uri_without_fixup() {
let listener =
new Listener();
let uri = Services.io.newURI(
"http://someintranet");
Services.prefs.setBoolPref(
"browser.urlbar.dnsResolveFullyQualifiedNames",
false
);
lazy.gDNSOverride.addIPOverride(uri.displayHost, FAKE_IP);
// Hosts without periods should end with a period to make them FQN
lazy.gDNSOverride.addIPOverride(uri.displayHost +
".", FAKE_INTRANET_IP);
Services.uriFixup.checkHost(uri, listener, ORIGIN_ATTRIBUTE);
Assert.deepEqual(
await listener.addresses(),
FAKE_IP,
"Should've received non-fixed up IP"
);
lazy.gDNSOverride.clearHostOverride(uri.displayHost);
lazy.gDNSOverride.clearHostOverride(uri.displayHost +
".");
Services.dns.clearCache(
false);
});
add_task(async
function test_ip_address() {
let listener =
new Listener();
let uri = Services.io.newURI(
"http://192.168.0.1");
// Testing IP address being passed into the method
// requires observing if the asyncResolve method gets called
let didResolve =
false;
let topic =
"uri-fixup-check-dns";
let observer = {
observe(aSubject, aTopicInner) {
if (aTopicInner == topic) {
didResolve =
true;
}
},
};
Services.obs.addObserver(observer, topic);
lazy.gDNSOverride.addIPOverride(uri.displayHost, FAKE_IP);
Services.uriFixup.checkHost(uri, listener, ORIGIN_ATTRIBUTE);
Assert.equal(
didResolve,
false,
"Passing an IP address should not conduct a host lookup"
);
lazy.gDNSOverride.clearHostOverride(uri.displayHost);
Services.dns.clearCache(
false);
Services.obs.removeObserver(observer, topic);
});