Link Guard Thunderbird v0.14.0 Source on GitHub

Approvals and blocks

Link Guard decides per host: the part of a link between https:// and the next /, for example login.example.org. This page explains how decisions are evaluated, what a scope covers, and which links need extra care.

Evaluation order

For every host in a link, Link Guard checks these rules in order. The first one that applies decides.

  1. A block denies the host. This includes your own exact and whole-domain blocks and every enabled imported blocklist. A block overrides every approval, including one for the current message; a blocked host opens only after it has been unblocked.
  2. A temporary approval for the current message allows the host.
  3. A permanent approval allows the host: your exact approvals, your whole-domain approvals and every enabled imported allowlist. A host with a warning still needs an exact approval (see Links with warnings).
  4. Everything else stays inactive until you decide.

A link is clickable only when its host is allowed.

Exact host or whole domain

Every permanent approval and every block has a scope.

Exact host – one host name and nothing else. Parent domains and subdomains are separate decisions:

Approved exactly login.example.org example.org www.login.example.org
login.example.org allowed not covered not covered

Whole domain – written *.example.org in Settings. It covers the registrable domain itself and every subdomain at any depth:

Approved whole domain example.org www.example.org a.b.example.org example.org.evil.net example.com
*.example.org allowed allowed allowed not covered not covered

What counts as a domain

Link Guard uses the bundled Public Suffix List to find the registrable domain of a host. That is why:

The bundled list is a snapshot that is updated before releases. A suffix added upstream after that snapshot is not known yet.

Shared-content hosts

Some services let anyone publish pages or documents under their domain. A whole-domain approval of the provider would silently approve content from strangers, so these hosts are excluded from whole-domain approvals and can only be approved exactly:

docs.google.com, drive.google.com, sites.google.com, forms.gle, onedrive.live.com, sharepoint.com, gist.github.com, github.io, gitlab.io, pages.dev, workers.dev, vercel.app, netlify.app, web.app, firebaseapp.com, appspot.com, and all of their subdomains.

For example, approving *.google.com does not make links to docs.google.com work. For these hosts the notice's ⋯ menu offers no whole-domain approval; only the exact host can be approved. Blocking them as a whole domain is possible.

This list is a limited catalogue. New services of this kind appear all the time, and an exact approval of such a host still allows every page on it. Use whole-domain approvals only for domains you control or fully trust.

A link with a warning needs a deliberate approval of its exact host: either Allow temporarily in the message, or a permanent approval of exactly that host. Whole-domain approvals and imported allowlists do not unlock it. This applies to:

The red warning stays visible next to the link even after you approve the host. If you switch a built-in warning off in Settings, its extra approval requirement goes away too.

Public URL shorteners

Shorteners such as bit.ly, tinyurl.com or t.co hide the real destination. Their links can only be allowed for the current message, after a second confirmation. They can never be approved permanently, and imported allowlists cannot approve them either. If you switch off the Public URL shortener warning, they are handled like any other host.

Recognised shorteners: bit.ly, bitly.is, bitly.com, j.mp, tinyurl.com, t.co, lnkd.in, buff.ly, ow.ly, rb.gy, rebrand.ly, s.gy, short.gy, is.gd, v.gd, tiny.cc, cutt.ly, bl.ink, and their subdomains.

A link whose address contains script or HTML code is the typical form of a cross-site scripting attack against the linked site – usually a site you trust. It can therefore only be allowed for the current message, even when its host is approved permanently. See Warnings.

Links such as https://192.0.2.10/ or https://[2001:db8::1]/ can only be allowed for the current message. They can be neither approved permanently nor blocked, because IP addresses change hands and say nothing about who runs the server.

How decisions affect each other

Decisions made in a message keep your rules consistent:

You … Link Guard also …
approve a host exactly removes your exact block of that host
approve a whole domain removes your whole-domain block of that domain and your exact block of the host you clicked
block a host exactly removes your exact approval of that host
block a whole domain removes the whole-domain approval and every exact approval inside that domain

Some permanent decisions are refused, and the notice shows Decision could not be saved:

Unblocking

A blocked host shows a single action in the notice:

You can also remove your own blocks in Settings.

Approvals and lookalike warnings

Your approvals also teach Link Guard which domains you trust. The registrable domains of your exact approvals, your whole-domain approvals and your enabled allowlists form the reference set for the lookalike warning: a host that differs from one of them by a single character gets a warning. Imported blocklists never shrink this set, so a hostile list cannot silence lookalike warnings.