Autogenerated with:
cp dom/.clang-format netwerk/ && mach format netwerk/**.{cpp,h,mm}
Manual fixes:
* mozurl/cbindgen.toml (including headers earlier)
* NetlinkService.h (forward-declaring a necessary struct)
* nsIWebSocketChannel.idl (forward-declaring OriginAttributes).
* nsAsyncRedirectVerifyHelper.h (forward-declaring nsIEventTarget)
* CapsuleEncoder.h gets a missing Capsule forward-decl.
* WebSocketConnectionBase.h gets some missing includes.
* HappyEyeballsConnectionAttempt gets some missing includes.
* nsUDPSocket missed nsSocketTransportService2.h for OnSocketThread().
* HttpInfo missed a forward declaration.
* MockHttpAuth missed an nsCOMPtr include.
* nsHttpAuthManager missed a forward declaration for nsIHttpAuthCache.
* WebTransportSessionProxy was using mozilla::Mutex in a member without
including it.
* win32 fixes to keep include order because windows headers suck.
* nsInputStreamPump needs an Atomics.h include.
Differential Revision: https://phabricator.services.mozilla.com/D311696
130 lines
4.5 KiB
C++
130 lines
4.5 KiB
C++
/* 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/. */
|
|
|
|
#include "DNSServiceBase.h"
|
|
|
|
#include "DNS.h"
|
|
#include "mozilla/ClearOnShutdown.h"
|
|
#include "mozilla/Preferences.h"
|
|
#include "mozilla/StaticPrefs_network.h"
|
|
#include "nsIDNSService.h"
|
|
#include "nsIPrefBranch.h"
|
|
#include "nsIProtocolProxyService2.h"
|
|
#include "nsIProxyInfo.h"
|
|
#include "nsThreadUtils.h"
|
|
|
|
#if defined(XP_WIN)
|
|
# include <shlobj.h>
|
|
#endif
|
|
|
|
#include "DNSLogging.h"
|
|
|
|
namespace mozilla::net {
|
|
|
|
static const char kPrefProxyType[] = "network.proxy.type";
|
|
static const char kPrefDisablePrefetch[] = "network.dns.disablePrefetch";
|
|
static const char kPrefNetworkProxySOCKS[] = "network.proxy.socks";
|
|
static const char kPrefNetworkProxySOCKSVersion[] =
|
|
"network.proxy.socks_version";
|
|
|
|
NS_IMPL_ISUPPORTS(DNSServiceBase, nsIObserver)
|
|
|
|
void DNSServiceBase::AddPrefObserver(nsIPrefBranch* aPrefs) {
|
|
aPrefs->AddObserver(kPrefProxyType, this, false);
|
|
// [pref-trie-audit] "network.dns.disablePrefetch" is an ambiguous prefix of
|
|
// "network.dns.disablePrefetchFromHTTPS"; triggers only for the exact pref
|
|
// ("disablePrefetchFromHTTPS" is a StaticPref and needs no callback).
|
|
aPrefs->AddObserver(kPrefDisablePrefetch, this, false);
|
|
// Monitor these to see if there is a change in proxy configuration
|
|
// [pref-trie-audit] "network.proxy.socks" is an ambiguous prefix of
|
|
// "network.proxy.socks5_remote_dns", "network.proxy.socks_port",
|
|
// "network.proxy.socks_remote_dns", "network.proxy.socks_version";
|
|
// triggers only for the exact pref (the others are StaticPrefs or have their
|
|
// own observers).
|
|
aPrefs->AddObserver(kPrefNetworkProxySOCKS, this, false);
|
|
aPrefs->AddObserver(kPrefNetworkProxySOCKSVersion, this, false);
|
|
}
|
|
|
|
void DNSServiceBase::ReadPrefs(const char* aName) {
|
|
if (!aName || !strcmp(aName, kPrefNetworkProxySOCKS) ||
|
|
!strcmp(aName, kPrefNetworkProxySOCKSVersion)) {
|
|
uint32_t socksVersion = Preferences::GetInt(kPrefNetworkProxySOCKSVersion);
|
|
nsAutoCString socks;
|
|
if (NS_SUCCEEDED(Preferences::GetCString(kPrefNetworkProxySOCKS, socks))) {
|
|
mSocksProxyVersion = 0;
|
|
if (!socks.IsEmpty()) {
|
|
if (socksVersion == nsIProxyInfo::SOCKS_V4) {
|
|
mSocksProxyVersion = nsIProxyInfo::SOCKS_V4;
|
|
} else if (socksVersion == nsIProxyInfo::SOCKS_V5) {
|
|
mSocksProxyVersion = nsIProxyInfo::SOCKS_V5;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (!aName || !strcmp(aName, kPrefDisablePrefetch) ||
|
|
!strcmp(aName, kPrefProxyType)) {
|
|
mDisablePrefetch = Preferences::GetBool(kPrefDisablePrefetch, false) ||
|
|
(StaticPrefs::network_proxy_type() ==
|
|
nsIProtocolProxyService::PROXYCONFIG_MANUAL);
|
|
}
|
|
}
|
|
|
|
bool DNSServiceBase::DNSForbiddenByActiveProxy(const nsACString& aHostname,
|
|
uint32_t aFlags) {
|
|
if (aFlags & nsIDNSService::RESOLVE_IGNORE_SOCKS_DNS) {
|
|
return false;
|
|
}
|
|
|
|
// TODO(Bug 1890542): use nsIProxyInfo object whether sending DNS request to
|
|
// local network is fine.
|
|
// We should avoid doing DNS when a proxy is in use.
|
|
if (StaticPrefs::network_proxy_type() ==
|
|
nsIProtocolProxyService::PROXYCONFIG_MANUAL &&
|
|
((mSocksProxyVersion == nsIProxyInfo::SOCKS_V4 &&
|
|
StaticPrefs::network_proxy_socks_remote_dns()) ||
|
|
(mSocksProxyVersion == nsIProxyInfo::SOCKS_V5 &&
|
|
StaticPrefs::network_proxy_socks5_remote_dns()))) {
|
|
// Allow IP lookups through, but nothing else.
|
|
if (!HostIsIPLiteral(aHostname)) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
void DNSServiceBase::DoReadEtcHostsFile(ParsingCallback aCallback) {
|
|
MOZ_ASSERT(XRE_IsParentProcess());
|
|
|
|
if (!StaticPrefs::network_trr_exclude_etc_hosts()) {
|
|
return;
|
|
}
|
|
|
|
auto readHostsTask = [aCallback]() {
|
|
MOZ_ASSERT(!NS_IsMainThread(), "Must not run on the main thread");
|
|
#if defined(XP_WIN)
|
|
nsCString path;
|
|
path.SetLength(MAX_PATH + 1);
|
|
if (!SHGetSpecialFolderPathA(NULL, path.BeginWriting(), CSIDL_SYSTEM,
|
|
false)) {
|
|
LOG(("Calling SHGetSpecialFolderPathA failed"));
|
|
return;
|
|
}
|
|
|
|
path.SetLength(strlen(path.get()));
|
|
path.Append("\\drivers\\etc\\hosts");
|
|
#else
|
|
nsAutoCString path("/etc/hosts"_ns);
|
|
#endif
|
|
|
|
LOG(("Reading hosts file at %s", path.get()));
|
|
rust_parse_etc_hosts(&path, aCallback);
|
|
};
|
|
|
|
(void)NS_DispatchBackgroundTask(
|
|
NS_NewRunnableFunction("Read /etc/hosts file", readHostsTask),
|
|
NS_DISPATCH_EVENT_MAY_BLOCK);
|
|
}
|
|
|
|
} // namespace mozilla::net
|