blocker: an exception reads like a block, so make it behave like one
`youtube.com` on the block list catches `music.youtube.com` — a plain entry covers its subtree. `youtube.com` on the *allow* list caught only itself, because exceptions were glob-matched whatever they looked like and a plain name has no metacharacters. The same text in two boxes of the same form meant a subtree in one and a single hostname in the other, with nothing in the UI saying so. A plain exception now covers its subdomains; a masked one is glob-matched exactly as before, which is still how you spare something narrower than a whole subtree (`docs.*`, `*.docs.google.com`). Three enforcers decide this and all three had to move together, or an exception would work in the browser and not at the resolver: `blocker_service.is_allowed`, `:core`'s `isAllowed`, and the desktop DNS stub's own allow check, which was reusing the generic glob matcher. Parity tests on both sides, plus the two sentences in the web UI and the README that promised the old behaviour. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
7 files changed
+120
-9
No files matched your search
@@ -70,6 +70,32 @@ def test_masked_subdomains_are_expanded(session, settings):
|
||||
assert hosts == ["google.com", "www.google.com", "mail.google.com"]
|
||||
|
||||
|
||||
def test_a_plain_exception_covers_its_subdomains_like_a_plain_block_does(session, settings):
|
||||
"""The two halves of one list have to read the same way.
|
||||
|
||||
`youtube.com` on the block list catches `music.youtube.com`. For a long time
|
||||
`youtube.com` on the *allow* list caught only itself, because exceptions were
|
||||
glob-matched — so the same text meant a subtree in one box and one hostname
|
||||
in the other, with nothing saying so.
|
||||
"""
|
||||
settings.blocker.blocked_domains = ["*.youtube.com", "reddit.com"]
|
||||
settings.blocker.subdomain_expansions = ["www", "m", "music"]
|
||||
settings.blocker.allowed_domains = ["youtube.com"]
|
||||
|
||||
hosts = blocker_service.expand_domains(settings)
|
||||
|
||||
assert hosts == ["reddit.com", "www.reddit.com", "m.reddit.com"]
|
||||
assert blocker_service.is_allowed("music.youtube.com", ["youtube.com"])
|
||||
assert not blocker_service.is_allowed("notyoutube.com", ["youtube.com"])
|
||||
|
||||
|
||||
def test_a_masked_exception_is_still_a_glob(session, settings):
|
||||
"""Which is how you allow something narrower than a whole subtree."""
|
||||
assert blocker_service.is_allowed("docs.google.com", ["docs.*"])
|
||||
assert blocker_service.is_allowed("a.docs.google.com", ["*.docs.google.com"])
|
||||
assert not blocker_service.is_allowed("sheets.google.com", ["docs.*"])
|
||||
|
||||
|
||||
def test_allow_masks_carve_holes_in_block_masks(session, settings):
|
||||
settings.blocker.blocked_domains = ["*.google.com", "reddit.com"]
|
||||
settings.blocker.subdomain_expansions = ["www", "docs"]
|
||||
|
||||
Reference in new issue
Block a user