Bug 1634462 - Add doh-rollout.mode pref check and mode change notification r=dragana,necko-reviewers

Differential Revision: https://phabricator.services.mozilla.com/D74316
This commit is contained in:
Valentin Gosu 2020-05-13 13:37:02 +00:00
parent 3f4d65a8af
commit 197dbfbdde
5 changed files with 68 additions and 14 deletions

View File

@ -373,6 +373,11 @@ ChildDNSService::GetCurrentTrrURI(nsACString& aURI) {
return NS_ERROR_NOT_AVAILABLE;
}
NS_IMETHODIMP
ChildDNSService::GetCurrentTrrMode(uint32_t* aMode) {
return NS_ERROR_NOT_AVAILABLE;
}
NS_IMETHODIMP
ChildDNSService::GetMyHostName(nsACString& result) {
// TODO: get value from parent during PNecko construction?

View File

@ -26,6 +26,7 @@ static const char kDisableIpv6Pref[] = "network.dns.disableIPv6";
static const char kPrefSkipTRRParentalControl[] =
"network.dns.skipTRR-when-parental-control-enabled";
static const char kRolloutURIPref[] = "doh-rollout.uri";
static const char kRolloutModePref[] = "doh-rollout.mode";
#define TRR_PREF_PREFIX "network.trr."
#define TRR_PREF(x) TRR_PREF_PREFIX x
@ -89,6 +90,7 @@ nsresult TRRService::Init() {
prefBranch->AddObserver(kDisableIpv6Pref, this, true);
prefBranch->AddObserver(kPrefSkipTRRParentalControl, this, true);
prefBranch->AddObserver(kRolloutURIPref, this, true);
prefBranch->AddObserver(kRolloutModePref, this, true);
}
nsCOMPtr<nsICaptivePortalService> captivePortalService =
do_GetService(NS_CAPTIVEPORTAL_CID);
@ -274,6 +276,35 @@ void TRRService::CheckURIPrefs() {
MaybeSetPrivateURI(mURIPref);
}
// static
uint32_t TRRService::ModeFromPrefs() {
// 0 - off, 1 - reserved, 2 - TRR first, 3 - TRR only, 4 - reserved,
// 5 - explicit off
auto processPrefValue = [](uint32_t value) -> uint32_t {
if (value == MODE_RESERVED1 || value == MODE_RESERVED4 ||
value > MODE_TRROFF) {
return MODE_TRROFF;
}
return value;
};
uint32_t tmp = MODE_NATIVEONLY;
if (NS_SUCCEEDED(Preferences::GetUint(TRR_PREF("mode"), &tmp))) {
tmp = processPrefValue(tmp);
}
if (tmp != MODE_NATIVEONLY) {
return tmp;
}
if (NS_SUCCEEDED(Preferences::GetUint(kRolloutModePref, &tmp))) {
return processPrefValue(tmp);
}
return MODE_NATIVEONLY;
}
nsresult TRRService::ReadPrefs(const char* name) {
MOZ_ASSERT(NS_IsMainThread(), "wrong thread");
@ -281,21 +312,17 @@ nsresult TRRService::ReadPrefs(const char* name) {
// we set this to true then do it at the end of the method.
bool clearEntireCache = false;
if (!name || !strcmp(name, TRR_PREF("mode"))) {
// 0 - off, 1 - reserved, 2 - TRR first, 3 - TRR only, 4 - reserved,
// 5 - explicit off
uint32_t tmp;
if (NS_SUCCEEDED(Preferences::GetUint(TRR_PREF("mode"), &tmp))) {
if (tmp > MODE_TRROFF) {
tmp = MODE_TRROFF;
if (!name || !strcmp(name, TRR_PREF("mode")) ||
!strcmp(name, kRolloutModePref)) {
uint32_t oldMode = mMode;
mMode = ModeFromPrefs();
if (mMode != oldMode) {
nsCOMPtr<nsIObserverService> obs =
mozilla::services::GetObserverService();
if (obs) {
obs->NotifyObservers(nullptr, NS_NETWORK_TRR_MODE_CHANGED_TOPIC,
nullptr);
}
if (tmp == MODE_RESERVED1) {
tmp = MODE_TRROFF;
}
if (tmp == MODE_RESERVED4) {
tmp = MODE_TRROFF;
}
mMode = tmp;
}
}
if (!name || !strcmp(name, TRR_PREF("uri")) ||

View File

@ -107,6 +107,8 @@ class TRRService : public nsIObserver,
void ProcessURITemplate(nsACString& aURI);
void ClearEntireCache();
static uint32_t ModeFromPrefs();
bool mInitialized;
Atomic<uint32_t, Relaxed> mMode;
Atomic<uint32_t, Relaxed> mTRRBlacklistExpireTime;

View File

@ -1371,6 +1371,15 @@ nsDNSService::GetCurrentTrrURI(nsACString& aURI) {
return NS_OK;
}
NS_IMETHODIMP
nsDNSService::GetCurrentTrrMode(uint32_t* aMode) {
*aMode = 0; // The default mode.
if (mTrrService) {
*aMode = mTrrService->Mode();
}
return NS_OK;
}
size_t nsDNSService::SizeOfIncludingThis(
mozilla::MallocSizeOf mallocSizeOf) const {
// Measurement of the following members may be added later if DMD finds it

View File

@ -318,6 +318,11 @@ interface nsIDNSService : nsISupports
*/
readonly attribute AUTF8String currentTrrURI;
/**
* Returns the value of the TRR Service's current default mode.
*/
readonly attribute unsigned long currentTrrMode;
/**
* @return the hostname of the operating system.
*/
@ -417,5 +422,11 @@ interface nsIDNSService : nsISupports
*/
#define NS_NETWORK_TRR_URI_CHANGED_TOPIC "network:trr-uri-changed"
/**
* An observer notification for this topic is sent whenever the mode that the
* TRR service is using has changed.
*/
#define NS_NETWORK_TRR_MODE_CHANGED_TOPIC "network:trr-mode-changed"
%}