tor-browser

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

commit e5d9f3de48cf1118cda5726f6e20d93b9a7ba0eb
parent 53600157c00452353a56c0710addf1d0f46f7563
Author: agoloman <agoloman@mozilla.com>
Date:   Wed, 15 Oct 2025 17:13:37 +0300

Revert "Bug 1988152 - support enterprise policy for domain based filtering for LNA. r=necko-reviewers,jesup,mkaply" for causing build bustages @TestLocalNetworkAccess.cpp.

This reverts commit fd3c32ffc06af01a6b6e773ac6a243d44265c87b.

Revert "Bug 1988152 - support configuration to skip LNA checks target domains. r=necko-reviewers,valentin"

This reverts commit 0c1efe49759aff467d31238ea10851c30bf83315.

Diffstat:
Mbrowser/components/enterprisepolicies/Policies.sys.mjs | 10----------
Mbrowser/components/enterprisepolicies/schemas/policies-schema.json | 6------
Mbrowser/components/enterprisepolicies/tests/xpcshell/test_local_network_access.js | 87-------------------------------------------------------------------------------
Mmodules/libpref/init/StaticPrefList.yaml | 7-------
Mnetwerk/base/LNAPermissionRequest.cpp | 14--------------
Mnetwerk/base/nsIOService.cpp | 52----------------------------------------------------
Mnetwerk/base/nsIOService.h | 4----
Mnetwerk/protocol/http/nsHttpTransaction.cpp | 8--------
Mnetwerk/test/gtest/TestLocalNetworkAccess.cpp | 114-------------------------------------------------------------------------------
Mnetwerk/test/unit/test_local_network_access.js | 264-------------------------------------------------------------------------------
10 files changed, 0 insertions(+), 566 deletions(-)

diff --git a/browser/components/enterprisepolicies/Policies.sys.mjs b/browser/components/enterprisepolicies/Policies.sys.mjs @@ -1867,16 +1867,6 @@ export var Policies = { ); } } - - // Handle SkipDomains separately (can be set independently of Enabled) - if ("SkipDomains" in param && Array.isArray(param.SkipDomains)) { - let skipDomainsValue = param.SkipDomains.join(","); - PoliciesUtils.setDefaultPref( - "network.lna.skip-domains", - skipDomainsValue, - param.Locked - ); - } }, }, diff --git a/browser/components/enterprisepolicies/schemas/policies-schema.json b/browser/components/enterprisepolicies/schemas/policies-schema.json @@ -1011,12 +1011,6 @@ "EnablePrompting": { "type": "boolean" }, - "SkipDomains": { - "type": "array", - "items": { - "type": "string" - } - }, "Locked": { "type": "boolean" } diff --git a/browser/components/enterprisepolicies/tests/xpcshell/test_local_network_access.js b/browser/components/enterprisepolicies/tests/xpcshell/test_local_network_access.js @@ -417,90 +417,3 @@ add_task(async function test_local_network_access_policy_enforcement() { "Preference should still be locked" ); }); - -add_task(async function test_local_network_access_skip_domains() { - // Test SkipDomains policy - await setupPolicyEngineWithJson({ - policies: { - LocalNetworkAccess: { - SkipDomains: ["example.com", "*.local", "localhost"], - }, - }, - }); - - equal( - Services.prefs.getCharPref("network.lna.skip-domains"), - "example.com,*.local,localhost", - "network.lna.skip-domains should be set correctly" - ); - - equal( - Services.prefs.prefIsLocked("network.lna.skip-domains"), - false, - "network.lna.skip-domains should not be locked when Locked is not specified" - ); -}); - -add_task(async function test_local_network_access_skip_domains_locked() { - // Test SkipDomains policy with locking - await setupPolicyEngineWithJson({ - policies: { - LocalNetworkAccess: { - SkipDomains: ["*.example.com", "server.local"], - Locked: true, - }, - }, - }); - - equal( - Services.prefs.getCharPref("network.lna.skip-domains"), - "*.example.com,server.local", - "network.lna.skip-domains should be set correctly" - ); - - equal( - Services.prefs.prefIsLocked("network.lna.skip-domains"), - true, - "network.lna.skip-domains should be locked when Locked: true is specified" - ); -}); - -add_task(async function test_local_network_access_enabled_with_skip_domains() { - // Test combining Enabled with SkipDomains - await setupPolicyEngineWithJson({ - policies: { - LocalNetworkAccess: { - Enabled: true, - SkipDomains: ["*"], - }, - }, - }); - - equal( - Services.prefs.getBoolPref("network.lna.enabled"), - true, - "network.lna.enabled should be true" - ); - equal( - Services.prefs.getCharPref("network.lna.skip-domains"), - "*", - 'network.lna.skip-domains should be "*" to skip all domains' - ); -}); - -add_task(async function test_local_network_access_skip_domains_empty_array() { - // Test SkipDomains with empty array - await setupPolicyEngineWithJson({ - policies: { - LocalNetworkAccess: { - SkipDomains: [], - }, - }, - }); - - equal( - Services.prefs.getCharPref("network.lna.skip-domains"), - "", - "network.lna.skip-domains should be empty string for empty array" - ); -}); diff --git a/modules/libpref/init/StaticPrefList.yaml b/modules/libpref/init/StaticPrefList.yaml @@ -14493,13 +14493,6 @@ value: true mirror: always -# Comma-separated list of domains to skip LNA checks for. -# Supports suffix wildcard patterns (*.example.com) -- name: network.lna.skip-domains - type: String - value: "" - mirror: never - # The proxy type. See nsIProtocolProxyService.idl # PROXYCONFIG_DIRECT = 0 # PROXYCONFIG_MANUAL = 1 diff --git a/netwerk/base/LNAPermissionRequest.cpp b/netwerk/base/LNAPermissionRequest.cpp @@ -13,8 +13,6 @@ #include "mozilla/glean/NetwerkMetrics.h" #include "mozilla/dom/WindowGlobalParent.h" -#include "nsIIOService.h" -#include "nsIOService.h" namespace mozilla::net { @@ -109,18 +107,6 @@ nsresult LNAPermissionRequest::RequestPermission() { return Cancel(); } - // Check if the domain should skip LNA checks - if (mPrincipal && gIOService) { - nsAutoCString origin; - nsresult rv = mPrincipal->GetAsciiHost(origin); - if (NS_SUCCEEDED(rv) && !origin.IsEmpty()) { - if (gIOService->ShouldSkipDomainForLNA(origin)) { - // Domain is in the skip list, grant permission automatically - return Allow(JS::UndefinedHandleValue); - } - } - } - PromptResult pr = CheckPromptPrefs(); if (pr == PromptResult::Granted) { return Allow(JS::UndefinedHandleValue); diff --git a/netwerk/base/nsIOService.cpp b/netwerk/base/nsIOService.cpp @@ -105,7 +105,6 @@ using mozilla::dom::ServiceWorkerDescriptor; #define PREF_LNA_IP_ADDR_SPACE_PRIVATE \ "network.lna.address_space.private.override" #define PREF_LNA_IP_ADDR_SPACE_LOCAL "network.lna.address_space.local.override" -#define PREF_LNA_SKIP_DOMAINS "network.lna.skip-domains" nsIOService* gIOService; static bool gCaptivePortalEnabled = false; @@ -235,7 +234,6 @@ static const char* gCallbackPrefs[] = { PREF_LNA_IP_ADDR_SPACE_PUBLIC, PREF_LNA_IP_ADDR_SPACE_PRIVATE, PREF_LNA_IP_ADDR_SPACE_LOCAL, - PREF_LNA_SKIP_DOMAINS, nullptr, }; @@ -1664,10 +1662,6 @@ void nsIOService::PrefsChanged(const char* pref) { UpdateAddressSpaceOverrideList(PREF_LNA_IP_ADDR_SPACE_LOCAL, mLocalAddressSpaceOverrideList); } - if (!pref || strncmp(pref, PREF_LNA_SKIP_DOMAINS, - strlen(PREF_LNA_SKIP_DOMAINS)) == 0) { - UpdateSkipDomainsList(); - } } void nsIOService::UpdateAddressSpaceOverrideList( @@ -1686,52 +1680,6 @@ void nsIOService::UpdateAddressSpaceOverrideList( aTargetList = std::move(addressSpaceOverridesArray); } -void nsIOService::UpdateSkipDomainsList() { - nsAutoCString skipDomains; - Preferences::GetCString(PREF_LNA_SKIP_DOMAINS, skipDomains); - - nsTArray<nsCString> skipDomainsArray; - nsCCharSeparatedTokenizer tokenizer(skipDomains, ','); - while (tokenizer.hasMoreTokens()) { - nsAutoCString token(tokenizer.nextToken()); - token.StripWhitespace(); - if (!token.IsEmpty()) { - skipDomainsArray.AppendElement(token); - } - } - - AutoWriteLock lock(mLock); - mLNASkipDomainsList = std::move(skipDomainsArray); -} - -bool nsIOService::ShouldSkipDomainForLNA(const nsACString& aDomain) { - AutoReadLock lock(mLock); - - // Check each domain pattern - for (const auto& pattern : mLNASkipDomainsList) { - // Special case: plain "*" matches all domains - if (pattern.Equals("*"_ns)) { - return true; - } - - // Suffix wildcard pattern (starts with *.) - if (StringBeginsWith(pattern, "*."_ns)) { - nsDependentCSubstring suffix(Substring(pattern, 2)); - nsDependentCSubstring suffixWithDot(Substring(pattern, 1)); - if (aDomain == suffix || StringEndsWith(aDomain, suffixWithDot)) { - return true; - } - } - - // Exact match - if (pattern == aDomain) { - return true; - } - } - - return false; -} - void nsIOService::ParsePortList(const char* pref, bool remove) { nsAutoCString portList; nsTArray<int32_t> restrictedPortList; diff --git a/netwerk/base/nsIOService.h b/netwerk/base/nsIOService.h @@ -158,8 +158,6 @@ class nsIOService final : public nsIIOService, NS_IMETHODIMP GetOverridenIpAddressSpace( nsILoadInfo::IPAddressSpace* aIpAddressSpace, const NetAddr& aAddr); - bool ShouldSkipDomainForLNA(const nsACString& aDomain); - private: // These shouldn't be called directly: // - construct using GetInstance @@ -215,7 +213,6 @@ class nsIOService final : public nsIIOService, void UpdateAddressSpaceOverrideList(const char* aPrefName, nsTArray<nsCString>& aTargetList); - void UpdateSkipDomainsList(); private: mozilla::Atomic<bool, mozilla::Relaxed> mOffline{true}; @@ -250,7 +247,6 @@ class nsIOService final : public nsIIOService, nsTArray<nsCString> mPublicAddressSpaceOverridesList MOZ_GUARDED_BY(mLock); nsTArray<nsCString> mPrivateAddressSpaceOverridesList MOZ_GUARDED_BY(mLock); nsTArray<nsCString> mLocalAddressSpaceOverrideList MOZ_GUARDED_BY(mLock); - nsTArray<nsCString> mLNASkipDomainsList MOZ_GUARDED_BY(mLock); nsTHashMap<nsCString, RuntimeProtocolHandler> mRuntimeProtocolHandlers MOZ_GUARDED_BY(mLock); diff --git a/netwerk/protocol/http/nsHttpTransaction.cpp b/netwerk/protocol/http/nsHttpTransaction.cpp @@ -63,7 +63,6 @@ #include "nsTransportUtils.h" #include "sslerr.h" #include "SpeculativeTransaction.h" -#include "mozilla/Preferences.h" //----------------------------------------------------------------------------- @@ -3738,17 +3737,10 @@ nsILoadInfo::IPAddressSpace nsHttpTransaction::GetTargetIPAddressSpace() { bool nsHttpTransaction::AllowedToConnectToIpAddressSpace( nsILoadInfo::IPAddressSpace aTargetIpAddressSpace) { // skip checks if LNA feature is disabled - if (!StaticPrefs::network_lna_enabled()) { return true; } - // Skip LNA checks if domain is in skip list - if (mConnInfo && gIOService && - gIOService->ShouldSkipDomainForLNA(mConnInfo->GetOrigin())) { - return true; - } - // store targetIpAddress space which is required later by nsHttpChannel for // permission prompts { diff --git a/netwerk/test/gtest/TestLocalNetworkAccess.cpp b/netwerk/test/gtest/TestLocalNetworkAccess.cpp @@ -8,8 +8,6 @@ #include "mozilla/StaticPrefs_network.h" #include "mozilla/Preferences.h" #include "mozilla/net/DNS.h" -#include "nsNetUtil.h" -#include "nsIOService.h" TEST(TestNetAddrLNAUtil, IPAddressSpaceCategorization) { @@ -152,115 +150,3 @@ TEST(TestNetAddrLNAUtil, DefaultAndOverrideTransitions) << "Expected reset back to default space for " << tc.ip; } } - -TEST(TestNetAddrLNAUtil, ShouldSkipDomainForLNA) -{ - using mozilla::Preferences; - - // Get nsIOService instance - nsIOService* ioService = gIOService; - ASSERT_NE(ioService, nullptr); - - // Test with empty preference (should not skip any domains) - Preferences::SetCString("network.lna.skip-domains", ""_ns); - EXPECT_FALSE(ioService->ShouldSkipDomainForLNA("example.com"_ns)); - EXPECT_FALSE(ioService->ShouldSkipDomainForLNA("test.example.com"_ns)); - EXPECT_FALSE(ioService->ShouldSkipDomainForLNA("localhost"_ns)); - - // Test exact domain matching - Preferences::SetCString("network.lna.skip-domains", - "example.com,test.org"_ns); - EXPECT_TRUE(ioService->ShouldSkipDomainForLNA("example.com"_ns)); - EXPECT_TRUE(ioService->ShouldSkipDomainForLNA("test.org"_ns)); - EXPECT_FALSE(ioService->ShouldSkipDomainForLNA("sub.example.com"_ns)); - EXPECT_FALSE(ioService->ShouldSkipDomainForLNA("example.org"_ns)); - EXPECT_FALSE(ioService->ShouldSkipDomainForLNA("notexample.com"_ns)); - - // Test wildcard domain matching - Preferences::SetCString("network.lna.skip-domains", - "*.example.com,*.test.org"_ns); - EXPECT_TRUE(ioService->ShouldSkipDomainForLNA("sub.example.com"_ns)); - EXPECT_TRUE(ioService->ShouldSkipDomainForLNA("deep.sub.example.com"_ns)); - EXPECT_TRUE(ioService->ShouldSkipDomainForLNA("api.test.org"_ns)); - EXPECT_TRUE(ioService->ShouldSkipDomainForLNA( - "example.com"_ns)); // Should match exact domain too - EXPECT_TRUE(ioService->ShouldSkipDomainForLNA( - "test.org"_ns)); // Should match exact domain too - EXPECT_FALSE(ioService->ShouldSkipDomainForLNA("example.net"_ns)); - EXPECT_FALSE(ioService->ShouldSkipDomainForLNA("notexample.com"_ns)); - - // Test more suffix wildcard patterns - Preferences::SetCString("network.lna.skip-domains", - "*.local,*.internal,*.test"_ns); - EXPECT_TRUE(ioService->ShouldSkipDomainForLNA("server.local"_ns)); - EXPECT_TRUE(ioService->ShouldSkipDomainForLNA("api.internal"_ns)); - EXPECT_TRUE(ioService->ShouldSkipDomainForLNA("service.test"_ns)); - EXPECT_TRUE(ioService->ShouldSkipDomainForLNA("deep.subdomain.local"_ns)); - EXPECT_TRUE(ioService->ShouldSkipDomainForLNA( - "local"_ns)); // Should match exact domain too - EXPECT_TRUE(ioService->ShouldSkipDomainForLNA( - "internal"_ns)); // Should match exact domain too - EXPECT_FALSE(ioService->ShouldSkipDomainForLNA("local.example.com"_ns)); - EXPECT_FALSE(ioService->ShouldSkipDomainForLNA("localhost"_ns)); - EXPECT_FALSE(ioService->ShouldSkipDomainForLNA("example.com"_ns)); - - // Test mixed patterns (exact and suffix wildcard) - Preferences::SetCString( - "network.lna.skip-domains", - "localhost,*.dev.local,*.staging.com,production.example.com"_ns); - // Exact matches - EXPECT_TRUE(ioService->ShouldSkipDomainForLNA("localhost"_ns)); - EXPECT_TRUE(ioService->ShouldSkipDomainForLNA("production.example.com"_ns)); - // Suffix wildcard matches - EXPECT_TRUE(ioService->ShouldSkipDomainForLNA("api.dev.local"_ns)); - EXPECT_TRUE(ioService->ShouldSkipDomainForLNA("web.dev.local"_ns)); - EXPECT_TRUE(ioService->ShouldSkipDomainForLNA("dev.local"_ns)); - EXPECT_TRUE(ioService->ShouldSkipDomainForLNA("test.staging.com"_ns)); - EXPECT_TRUE(ioService->ShouldSkipDomainForLNA("api.staging.com"_ns)); - EXPECT_TRUE(ioService->ShouldSkipDomainForLNA("staging.com"_ns)); - // Non-matches - EXPECT_FALSE(ioService->ShouldSkipDomainForLNA("example.com"_ns)); - EXPECT_FALSE(ioService->ShouldSkipDomainForLNA("dev.example.com"_ns)); - EXPECT_FALSE(ioService->ShouldSkipDomainForLNA("staging.example.com"_ns)); - - // Test with whitespace and empty entries - Preferences::SetCString( - "network.lna.skip-domains", - " example.com , , *.test.local , admin.internal "_ns); - EXPECT_TRUE(ioService->ShouldSkipDomainForLNA("example.com"_ns)); - EXPECT_TRUE(ioService->ShouldSkipDomainForLNA("api.test.local"_ns)); - EXPECT_TRUE(ioService->ShouldSkipDomainForLNA("admin.internal"_ns)); - EXPECT_FALSE(ioService->ShouldSkipDomainForLNA("test.com"_ns)); - - // Test invalid patterns (unknown patterns treated as exact match) - Preferences::SetCString("network.lna.skip-domains", - "example.com,invalid.pattern"_ns); - EXPECT_TRUE(ioService->ShouldSkipDomainForLNA( - "example.com"_ns)); // Valid exact match - EXPECT_TRUE(ioService->ShouldSkipDomainForLNA( - "invalid.pattern"_ns)); // Treated as exact match - EXPECT_FALSE(ioService->ShouldSkipDomainForLNA("test.com"_ns)); // No match - - // Test case sensitivity - Preferences::SetCString("network.lna.skip-domains", - "Example.COM,*.Test.ORG"_ns); - EXPECT_TRUE( - ioService->ShouldSkipDomainForLNA("Example.COM"_ns)); // Exact case match - EXPECT_FALSE(ioService->ShouldSkipDomainForLNA( - "example.com"_ns)); // Different case (no match) - EXPECT_TRUE(ioService->ShouldSkipDomainForLNA( - "api.Test.ORG"_ns)); // Wildcard case match - EXPECT_FALSE(ioService->ShouldSkipDomainForLNA( - "api.test.org"_ns)); // Different case (no match) - - // Test plain "*" matches all domains - Preferences::SetCString("network.lna.skip-domains", "*"_ns); - EXPECT_TRUE(ioService->ShouldSkipDomainForLNA("example.com"_ns)); - EXPECT_TRUE(ioService->ShouldSkipDomainForLNA("test.org"_ns)); - EXPECT_TRUE(ioService->ShouldSkipDomainForLNA("localhost"_ns)); - EXPECT_TRUE(ioService->ShouldSkipDomainForLNA("any.domain.here"_ns)); - EXPECT_TRUE(ioService->ShouldSkipDomainForLNA("server.local"_ns)); - - // Reset preference for cleanup - Preferences::SetCString("network.lna.skip-domains", ""_ns); -} diff --git a/netwerk/test/unit/test_local_network_access.js b/netwerk/test/unit/test_local_network_access.js @@ -7,10 +7,6 @@ const { NodeHTTP2Server } = ChromeUtils.importESModule( "resource://testing-common/NodeServer.sys.mjs" ); -const override = Cc["@mozilla.org/network/native-dns-override;1"].getService( - Ci.nsINativeDNSResolverOverride -); - function makeChannel(url) { let uri2 = NetUtil.newURI(url); // by default system principal is used, which cannot be used for permission based tests @@ -54,22 +50,6 @@ ChromeUtils.defineLazyGetter(this, "H2_URL", function () { return "https://localhost:" + server.port(); }); -ChromeUtils.defineLazyGetter(this, "H1_EXAMPLE_URL", function () { - return "http://example.com:" + httpServer.identity.primaryPort; -}); - -ChromeUtils.defineLazyGetter(this, "H1_TEST_EXAMPLE_URL", function () { - return "http://test.example.com:" + httpServer.identity.primaryPort; -}); - -ChromeUtils.defineLazyGetter(this, "H1_SERVER_LOCAL_URL", function () { - return "http://server.local:" + httpServer.identity.primaryPort; -}); - -ChromeUtils.defineLazyGetter(this, "H1_API_DEV_LOCAL_URL", function () { - return "http://api.dev.local:" + httpServer.identity.primaryPort; -}); - let httpServer = null; let server = new NodeHTTP2Server(); function pathHandler(metadata, response) { @@ -93,11 +73,6 @@ add_setup(async () => { httpServer = new HttpServer(); httpServer.registerPathHandler("/test_lna", pathHandler); httpServer.start(-1); - // Add domain identities for testing domain skip patterns - httpServer.identity.add("http", "example.com", 80); - httpServer.identity.add("http", "test.example.com", 80); - httpServer.identity.add("http", "server.local", 80); - httpServer.identity.add("http", "api.dev.local", 80); // H2 Server let certdb = Cc["@mozilla.org/security/x509certdb;1"].getService( @@ -335,242 +310,3 @@ add_task(async function lna_blocking_tests_local_network() { } } }); - -// Test the network.lna.skip-domains preference -add_task(async function lna_domain_skip_tests() { - // Add DNS overrides to map test domains to 127.0.0.1 - override.clearOverrides(); - Services.dns.clearCache(true); - - override.addIPOverride("example.com", "127.0.0.1"); - override.addIPOverride("test.example.com", "127.0.0.1"); - override.addIPOverride("server.local", "127.0.0.1"); - override.addIPOverride("api.dev.local", "127.0.0.1"); - - // Add override such that target servers are considered as local network (and not localhost) - // This includes all the domains we're testing with - var override_value = - "127.0.0.1" + - ":" + - httpServer.identity.primaryPort + - "," + - "127.0.0.1" + - ":" + - server.port(); - - Services.prefs.setCharPref( - "network.lna.address_space.private.override", - override_value - ); - - const domainSkipTestCases = [ - // [skipDomains, parentSpace, expectedStatus, baseURL, description] - // Exact domain match - [ - "localhost", - Ci.nsILoadInfo.Public, - Cr.NS_OK, - H1_URL, - "exact domain match - localhost", - ], - [ - "localhost", - Ci.nsILoadInfo.Public, - Cr.NS_OK, - H2_URL, - "exact domain match - localhost H2", - ], - [ - "example.com", - Ci.nsILoadInfo.Public, - Cr.NS_OK, - H1_EXAMPLE_URL, - "exact domain match - example.com", - ], - - // Wildcard domain match - [ - "*.localhost", - Ci.nsILoadInfo.Public, - Cr.NS_OK, - H1_URL, - "wildcard domain match - *.localhost matches localhost", - ], - [ - "*.example.com", - Ci.nsILoadInfo.Public, - Cr.NS_OK, - H1_TEST_EXAMPLE_URL, - "wildcard domain match - *.example.com matches test.example.com", - ], - [ - "*.example.com", - Ci.nsILoadInfo.Public, - Cr.NS_OK, - H1_EXAMPLE_URL, - "wildcard domain match - *.example.com matches example.com", - ], - [ - "*.test.com", - Ci.nsILoadInfo.Public, - Cr.NS_ERROR_LOCAL_NETWORK_ACCESS_DENIED, - H1_EXAMPLE_URL, - "wildcard no match - *.test.com doesn't match example.com", - ], - - // Multiple domains (comma-separated) - [ - "example.com,localhost,test.org", - Ci.nsILoadInfo.Public, - Cr.NS_OK, - H1_URL, - "multiple domains - localhost match", - ], - [ - "example.com,localhost,test.org", - Ci.nsILoadInfo.Public, - Cr.NS_OK, - H1_EXAMPLE_URL, - "multiple domains - example.com match", - ], - [ - "foo.com,test.org", - Ci.nsILoadInfo.Public, - Cr.NS_ERROR_LOCAL_NETWORK_ACCESS_DENIED, - H1_EXAMPLE_URL, - "multiple domains no match - example.com not in list", - ], - - // Empty skip domains (should apply normal LNA rules) - [ - "", - Ci.nsILoadInfo.Public, - Cr.NS_ERROR_LOCAL_NETWORK_ACCESS_DENIED, - H1_URL, - "empty skip domains - should block", - ], - - // .local domain tests - [ - "*.local", - Ci.nsILoadInfo.Public, - Cr.NS_OK, - H1_SERVER_LOCAL_URL, - "wildcard .local - *.local matches server.local", - ], - [ - "*.local", - Ci.nsILoadInfo.Public, - Cr.NS_OK, - H1_API_DEV_LOCAL_URL, - "wildcard .local - *.local matches api.dev.local", - ], - [ - "*.dev.local", - Ci.nsILoadInfo.Public, - Cr.NS_OK, - H1_API_DEV_LOCAL_URL, - "wildcard subdomain .local - *.dev.local matches api.dev.local", - ], - [ - "server.local", - Ci.nsILoadInfo.Public, - Cr.NS_OK, - H1_SERVER_LOCAL_URL, - "exact match .local - server.local matches server.local", - ], - [ - "*.local", - Ci.nsILoadInfo.Public, - Cr.NS_ERROR_LOCAL_NETWORK_ACCESS_DENIED, - H1_URL, - "wildcard .local - *.local doesn't match localhost", - ], - - // localhost variations - [ - "localhost,*.local,*.internal", - Ci.nsILoadInfo.Public, - Cr.NS_OK, - H1_URL, - "combined patterns - localhost matches localhost", - ], - [ - "localhost,*.local,*.internal", - Ci.nsILoadInfo.Public, - Cr.NS_OK, - H1_SERVER_LOCAL_URL, - "combined patterns - *.local matches server.local", - ], - - // Plain "*" wildcard matches all domains - [ - "*", - Ci.nsILoadInfo.Public, - Cr.NS_OK, - H1_URL, - "wildcard all - * matches localhost", - ], - [ - "*", - Ci.nsILoadInfo.Public, - Cr.NS_OK, - H1_EXAMPLE_URL, - "wildcard all - * matches example.com", - ], - [ - "*", - Ci.nsILoadInfo.Public, - Cr.NS_OK, - H1_SERVER_LOCAL_URL, - "wildcard all - * matches server.local", - ], - [ - "*", - Ci.nsILoadInfo.Public, - Cr.NS_OK, - H1_TEST_EXAMPLE_URL, - "wildcard all - * matches test.example.com", - ], - ]; - - for (let [ - skipDomains, - parentSpace, - expectedStatus, - url, - description, - ] of domainSkipTestCases) { - info(`Testing domain skip: ${description} - domains: "${skipDomains}"`); - - // Set the domain skip preference - Services.prefs.setCharPref("network.lna.skip-domains", skipDomains); - - // Disable prompt simulation for clean testing - Services.prefs.setBoolPref("network.localhost.prompt.testing.allow", false); - - let chan = makeChannel(url + "/test_lna"); - chan.loadInfo.parentIpAddressSpace = parentSpace; - - let expectFailure = expectedStatus !== Cr.NS_OK ? CL_EXPECT_FAILURE : 0; - - await new Promise(resolve => { - chan.asyncOpen(new ChannelListener(resolve, null, expectFailure)); - }); - - Assert.equal( - chan.status, - expectedStatus, - `Status should match for: ${description}` - ); - if (expectedStatus === Cr.NS_OK) { - Assert.equal(chan.protocolVersion, url === H2_URL ? "h2" : "http/1.1"); - } - } - - // Cleanup - Services.prefs.clearUserPref("network.lna.skip-domains"); - Services.prefs.clearUserPref("network.lna.address_space.private.override"); - override.clearOverrides(); - Services.dns.clearCache(true); -});