Bug 1689474 - Make sure sending queries to ODoH proxy is working r=necko-reviewers,valentin

Differential Revision: https://phabricator.services.mozilla.com/D103817
This commit is contained in:
Kershaw Chang 2021-02-04 18:30:45 +00:00
parent a3582caf5e
commit 660e474854
2 changed files with 37 additions and 21 deletions

View File

@ -72,13 +72,13 @@ nsresult ODoHService::ReadPrefs(const char* aName) {
if (!aName || !strcmp(aName, kODoHProxyURIPref) || if (!aName || !strcmp(aName, kODoHProxyURIPref) ||
!strcmp(aName, kODoHTargetHostPref) || !strcmp(aName, kODoHTargetHostPref) ||
!strcmp(aName, kODoHTargetPathPref)) { !strcmp(aName, kODoHTargetPathPref)) {
OnODoHPrefsChange(); OnODoHPrefsChange(aName == nullptr);
} }
return NS_OK; return NS_OK;
} }
void ODoHService::OnODoHPrefsChange() { void ODoHService::OnODoHPrefsChange(bool aInit) {
nsAutoCString proxyURI; nsAutoCString proxyURI;
Preferences::GetCString(kODoHProxyURIPref, proxyURI); Preferences::GetCString(kODoHProxyURIPref, proxyURI);
nsAutoCString targetHost; nsAutoCString targetHost;
@ -101,10 +101,34 @@ void ODoHService::OnODoHPrefsChange() {
} }
if (updateODoHConfig) { if (updateODoHConfig) {
UpdateODoHConfig(); // When this function is called from ODoHService::Init(), it's on the same
// call stack as nsDNSService is inited. In this case, we need to dispatch
// UpdateODoHConfig(), since recursively getting DNS service is not allowed.
auto task = []() { gODoHService->UpdateODoHConfig(); };
if (aInit) {
NS_DispatchToMainThread(NS_NewRunnableFunction(
"ODoHService::UpdateODoHConfig", std::move(task)));
} else {
task();
}
} }
} }
static nsresult ExtractHost(const nsACString& aURI, nsCString& aResult) {
nsCOMPtr<nsIURI> uri;
nsresult rv = NS_NewURI(getter_AddRefs(uri), aURI);
if (NS_FAILED(rv)) {
return rv;
}
if (!uri->SchemeIs("https")) {
LOG(("ODoHService host uri is not https"));
return NS_ERROR_FAILURE;
}
return uri->GetAsciiHost(aResult);
}
void ODoHService::BuildODoHRequestURI() { void ODoHService::BuildODoHRequestURI() {
mLock.AssertCurrentThreadOwns(); mLock.AssertCurrentThreadOwns();
@ -118,9 +142,14 @@ void ODoHService::BuildODoHRequestURI() {
mODoHRequestURI.AppendLiteral("/"); mODoHRequestURI.AppendLiteral("/");
mODoHRequestURI.Append(mODoHTargetPath); mODoHRequestURI.Append(mODoHTargetPath);
} else { } else {
nsAutoCString hostStr;
if (NS_FAILED(ExtractHost(mODoHTargetHost, hostStr))) {
return;
}
mODoHRequestURI.Append(mODoHProxyURI); mODoHRequestURI.Append(mODoHProxyURI);
mODoHRequestURI.AppendLiteral("?targethost="); mODoHRequestURI.AppendLiteral("?targethost=");
mODoHRequestURI.Append(mODoHTargetHost); mODoHRequestURI.Append(hostStr);
mODoHRequestURI.AppendLiteral("&targetpath=/"); mODoHRequestURI.AppendLiteral("&targetpath=/");
mODoHRequestURI.Append(mODoHTargetPath); mODoHRequestURI.Append(mODoHTargetPath);
} }
@ -140,7 +169,7 @@ nsresult ODoHService::UpdateODoHConfig() {
nsAutoCString uri; nsAutoCString uri;
{ {
MutexAutoLock lock(mLock); MutexAutoLock lock(mLock);
uri = mODoHProxyURI.IsEmpty() ? mODoHTargetHost : mODoHProxyURI; uri = mODoHTargetHost;
} }
nsCOMPtr<nsIDNSService> dns( nsCOMPtr<nsIDNSService> dns(
@ -153,21 +182,8 @@ nsresult ODoHService::UpdateODoHConfig() {
return NS_ERROR_NOT_AVAILABLE; return NS_ERROR_NOT_AVAILABLE;
} }
nsCOMPtr<nsIURI> queryURI;
nsresult rv = NS_NewURI(getter_AddRefs(queryURI), uri);
if (NS_FAILED(rv)) {
return rv;
}
nsAutoCString scheme;
queryURI->GetScheme(scheme);
if (!scheme.Equals("https")) {
LOG(("ODoHService::UpdateODoHConfig uri is not https"));
return NS_ERROR_FAILURE;
}
nsAutoCString hostStr; nsAutoCString hostStr;
rv = queryURI->GetAsciiHost(hostStr); nsresult rv = ExtractHost(uri, hostStr);
if (NS_FAILED(rv)) { if (NS_FAILED(rv)) {
return rv; return rv;
} }

View File

@ -34,13 +34,13 @@ class ODoHService : public nsIDNSListener,
const Maybe<nsTArray<ObliviousDoHConfig>>& ODoHConfigs(); const Maybe<nsTArray<ObliviousDoHConfig>>& ODoHConfigs();
void AppendPendingODoHRequest(ODoH* aRequest); void AppendPendingODoHRequest(ODoH* aRequest);
void GetRequestURI(nsACString& aResult); void GetRequestURI(nsACString& aResult);
// Send a DNS query to reterive the ODoHConfig.
nsresult UpdateODoHConfig(); nsresult UpdateODoHConfig();
private: private:
virtual ~ODoHService(); virtual ~ODoHService();
nsresult ReadPrefs(const char* aName); nsresult ReadPrefs(const char* aName);
void OnODoHPrefsChange(); void OnODoHPrefsChange(bool aInit);
// Send a DNS query to reterive the ODoHConfig.
void BuildODoHRequestURI(); void BuildODoHRequestURI();
Mutex mLock; Mutex mLock;